Forget slow-loading images and frustrated users. We've built a high-performance content delivery network (CDN) using PHP, optimized for speed and scalability, and deployed it seamlessly on AWS Lambda using Bref. This solution is a game-changer for any website looking to boost performance and user experience. Let's dive into the details of this powerful and surprisingly simple setup.
<?php
// Include necessary libraries (imagine, etc.)
// Function to fetch and optimize image
function optimizeImage($imageUrl, $width, $height) {
// Fetch the image from the source URL
$image = file_get_contents($imageUrl);
// Check if image fetching was successful
if ($image === false) {
return false; // Or handle error appropriately
}
// Perform image optimization (resizing, compression, format conversion)
// ... (This section would contain image manipulation using a library like Imagine) ...
// Return optimized image data
return $optimizedImage;
}
// Function to handle CDN requests
function handleRequest($requestUrl) {
// Parse the URL to extract parameters (source URL, width, height)
// ... (URL parsing logic) ...
// Check for cached image (S3)
// ... (S3 interaction logic using AWS SDK) ...
// If cached, return cached image
if ($cachedImage) {
return $cachedImage;
}
// Otherwise, optimize and cache the image
$optimizedImage = optimizeImage($sourceUrl, $width, $height);
// Check if image optimization was successful
if ($optimizedImage === false){
return false; // Or handle error appropriately
}
// Cache the optimized image in S3
// ... (S3 interaction logic) ...
// Return the optimized image
return $optimizedImage;
}
// Handle the request
$response = handleRequest($_GET['url']);
if ($response){
// Set appropriate headers (content type, caching, etc.)
header('Content-type: image/webp'); // Or appropriate content type
header('Cache-Control: public, max-age=31536000'); // Cache for a year
// Output the optimized image
echo $response;
} else {
// Handle errors gracefully
http_response_code(500); // Internal Server Error
echo "Error processing image";
}
?>
# Dockerfile for the PHP CDN
FROM php:8.1-fpm
# Install necessary extensions
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev \
zlib1g-dev \
&& docker-php-ext-install -j$(nproc) pdo_mysql mbstring zip exif gd
# Copy application code
COPY . /var/www/html
# Set working directory
WORKDIR /var/www/html
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install dependencies
RUN composer install --no-dev --optimize-autoloader --no-interaction
# Expose port
EXPOSE 9000
# docker-compose.yml
version: "3.9"
services:
cdn:
build: .
ports:
- "9000:9000"
volumes:
- ./:/var/www/html
0 comments:
Post a Comment