API Performance
Optimasi Performa
Performa API adalah faktor kritis dalam pengembangan aplikasi modern. Dokumentasi ini mencakup strategi dan praktik terbaik untuk mengoptimalkan performa API Anda.
Caching
Response Caching
class CacheMiddleware {
public function handle($request) {
$key = $this->getCacheKey($request);
if ($cached = $this->cache->get($key)) {
return $cached;
}
$response = $this->processRequest($request);
$this->cache->set($key, $response, 3600);
return $response;
}
}
Cache Headers
header('Cache-Control: public, max-age=3600');
header('ETag: "' . md5($content) . '"');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');
Database Optimization
Query Optimization
// Gunakan index
CREATE INDEX idx_user_email ON users(email);
// Pilih kolom spesifik
SELECT id, name, email FROM users WHERE status = 'active';
// Gunakan joins yang efisien
SELECT u.*, p.*
FROM users u
INNER JOIN profiles p ON u.id = p.user_id
WHERE u.status = 'active';
Response Optimization
Pagination
class PaginatedResponse {
public function paginate($query, $page = 1, $perPage = 10) {
$total = $query->count();
$items = $query->offset(($page - 1) * $perPage)
->limit($perPage)
->get();
return [
'data' => $items,
'pagination' => [
'total' => $total,
'per_page' => $perPage,
'current_page' => $page,
'last_page' => ceil($total / $perPage)
]
];
}
}
Data Filtering
class DataFilter {
public function filter($data, $fields) {
return array_intersect_key($data, array_flip($fields));
}
}
Compression
// Enable GZIP compression
if (extension_loaded('zlib')) {
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', '5');
}
Load Balancing
upstream api_servers {
server api1.example.com:80;
server api2.example.com:80;
server api3.example.com:80;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_servers;
}
}
Best Practices
- Implementasikan caching di berbagai level
- Optimalkan query database
- Gunakan pagination untuk data besar
- Aktifkan kompresi response
- Implementasikan load balancing
- Monitor performa secara regular
- Gunakan CDN untuk aset statis
- Optimalkan payload response
- Implementasikan connection pooling
- Gunakan asynchronous processing untuk task berat
Monitoring
class PerformanceMonitor {
public function logMetrics($request, $response, $startTime) {
$endTime = microtime(true);
$duration = $endTime - $startTime;
$metrics = [
'endpoint' => $request->getPath(),
'method' => $request->getMethod(),
'duration' => $duration,
'memory' => memory_get_peak_usage(true),
'timestamp' => time()
];
$this->logger->log('performance', $metrics);
}
}
Profiling Tools
- New Relic - Monitoring dan profiling lengkap
- Xdebug - PHP profiling dan debugging
- Apache Benchmark (ab) - Load testing
- JMeter - Performance testing
- Prometheus - Metrics collection
- Grafana - Metrics visualization