PHP
Web開発に特化したサーバーサイド言語
PHPとは
PHPは1994年に誕生したサーバーサイドスクリプト言語です。 HTMLに埋め込んで動的なWebページを生成できます。 WordPress、Laravel、Symfony等の人気フレームワークがあり、 Webの約77%がPHPで動いていると言われています。
PHP実行アーキテクチャ
典型的なPHP Webアプリケーション構成
クライアント
ブラウザ
Webサーバー
Nginx / Apache
PHP-FPM
FastCGI Process Manager
PHP
スクリプト実行
ポイント: PHPは「リクエストごとに起動・終了」するモデル。 各リクエストは独立しており、状態を持たない(Shared Nothing)。 これによりスケールしやすいが、リクエストごとの初期化コストがある。
PHP-FPM(FastCGI Process Manager)
PHP-FPMは、PHPのFastCGI実装です。Webサーバーとは別プロセスでPHPを実行し、 プロセス管理、プール、ログなどの機能を提供します。
プロセス管理
- • static: 固定数のワーカー
- • dynamic: 負荷に応じて増減
- • ondemand: リクエスト時のみ起動
プール機能
- • サイトごとに異なるユーザーで実行
- • リソース制限(メモリ、CPU)
- • 個別の設定(php.ini)
1 ; /etc/php-fpm.d/www.conf 2 [www] 3 user = www-data 4 group = www-data 5 6 ; プロセス管理方式 7 pm = dynamic 8 pm.max_children = 50 ; 最大ワーカー数 9 pm.start_servers = 5 ; 起動時のワーカー数 10 pm.min_spare_servers = 5 ; 最小アイドルワーカー 11 pm.max_spare_servers = 35 ; 最大アイドルワーカー 12 13 ; スローログ(遅いリクエストの検出) 14 slowlog = /var/log/php-fpm/www-slow.log 15 request_slowlog_timeout = 5s 16 17 ; タイムアウト 18 request_terminate_timeout = 30s
OPcache
OPcacheは、PHPスクリプトをコンパイルしたバイトコード(opcode)をメモリにキャッシュします。 リクエストごとのパース・コンパイルを省略し、大幅な高速化を実現。
index.php
→パース
→OPcache
→実行
2回目以降はOPcacheから直接実行(パース省略)
1 ; php.ini OPcache設定 2 opcache.enable=1 3 opcache.memory_consumption=256 ; キャッシュサイズ(MB) 4 opcache.interned_strings_buffer=16 5 opcache.max_accelerated_files=10000 ; キャッシュするファイル数 6 opcache.validate_timestamps=0 ; 本番では0(ファイル変更チェック無効) 7 opcache.revalidate_freq=0 8 9 ; PHP 8.0+ JIT 10 opcache.jit=1255 11 opcache.jit_buffer_size=128M
Nginx + PHP-FPM 連携
1 # /etc/nginx/sites-available/example.conf 2 server { 3 listen 80; 4 server_name example.com; 5 root /var/www/example/public; 6 index index.php; 7 8 # 静的ファイルはNginxが直接配信 9 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { 10 expires 30d; 11 add_header Cache-Control "public, immutable"; 12 } 13 14 # PHPファイルはFPMに転送 15 location ~ \.php$ { 16 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; 17 # または TCP: fastcgi_pass 127.0.0.1:9000; 18 19 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 20 include fastcgi_params; 21 22 # タイムアウト設定 23 fastcgi_read_timeout 60s; 24 fastcgi_buffer_size 16k; 25 fastcgi_buffers 4 16k; 26 } 27 28 # Laravelなどのフレームワーク用 29 location / { 30 try_files $uri $uri/ /index.php?$query_string; 31 } 32 }
PHP 8の主要な機能
JITコンパイラ
PHP 8.0からJITコンパイラを導入。CPU集約的な処理が大幅に高速化。 ただしWebアプリではI/O待ちが多いため効果は限定的。
Union Types / Named Arguments
1 // Union Types 2 function process(int|string $value): int|false { 3 return is_numeric($value) ? (int)$value : false; 4 } 5 6 // Named Arguments 7 htmlspecialchars( 8 string: $text, 9 double_encode: false 10 );
Attributes(アノテーション)
1 #[Route('/api/users', methods: ['GET'])] 2 #[Middleware('auth')] 3 class UserController { 4 #[Required] 5 public string $name; 6 }
SRE/インフラ観点
監視項目
- • PHP-FPMのアクティブプロセス数
- • リクエスト処理時間(スローログ)
- • OPcacheヒット率
- • メモリ使用量(memory_limit)
スケーリング
- • 水平スケール: ロードバランサー配下に複数サーバー
- • セッション: Redis/Memcachedで共有
- • ファイル: 共有ストレージ or S3
デプロイ
- • OPcacheクリア:
opcache_reset()or FPM再起動 - • Graceful reload:
kill -USR2 - • Blue-Green / Rolling update
Docker構成例
1 # Dockerfile 2 FROM php:8.2-fpm-alpine 3 4 # 拡張機能インストール 5 RUN docker-php-ext-install pdo pdo_mysql opcache 6 7 # OPcache設定 8 COPY opcache.ini /usr/local/etc/php/conf.d/ 9 10 # Composer 11 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer 12 13 WORKDIR /var/www/html 14 COPY . . 15 16 # 本番用最適化 17 RUN composer install --no-dev --optimize-autoloader 18 19 CMD ["php-fpm"]
1 # docker-compose.yml 2 version: '3.8' 3 services: 4 nginx: 5 image: nginx:alpine 6 ports: 7 - "80:80" 8 volumes: 9 - ./nginx.conf:/etc/nginx/conf.d/default.conf 10 - ./src:/var/www/html 11 depends_on: 12 - php 13 14 php: 15 build: . 16 volumes: 17 - ./src:/var/www/html 18 environment: 19 - APP_ENV=production 20 21 redis: 22 image: redis:alpine