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]
3user = www-data
4group = www-data
5
6; プロセス管理方式
7pm = dynamic
8pm.max_children = 50 ; 最大ワーカー数
9pm.start_servers = 5 ; 起動時のワーカー数
10pm.min_spare_servers = 5 ; 最小アイドルワーカー
11pm.max_spare_servers = 35 ; 最大アイドルワーカー
12
13; スローログ(遅いリクエストの検出)
14slowlog = /var/log/php-fpm/www-slow.log
15request_slowlog_timeout = 5s
16
17; タイムアウト
18request_terminate_timeout = 30s

OPcache

OPcacheは、PHPスクリプトをコンパイルしたバイトコード(opcode)をメモリにキャッシュします。 リクエストごとのパース・コンパイルを省略し、大幅な高速化を実現。

index.php
パース
OPcache
実行

2回目以降はOPcacheから直接実行(パース省略)

1; php.ini OPcache設定
2opcache.enable=1
3opcache.memory_consumption=256 ; キャッシュサイズ(MB)
4opcache.interned_strings_buffer=16
5opcache.max_accelerated_files=10000 ; キャッシュするファイル数
6opcache.validate_timestamps=0 ; 本番では0(ファイル変更チェック無効)
7opcache.revalidate_freq=0
8
9; PHP 8.0+ JIT
10opcache.jit=1255
11opcache.jit_buffer_size=128M

Nginx + PHP-FPM 連携

1# /etc/nginx/sites-available/example.conf
2server {
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
2function process(int|string $value): int|false {
3 return is_numeric($value) ? (int)$value : false;
4}
5
6// Named Arguments
7htmlspecialchars(
8 string: $text,
9 double_encode: false
10);

Attributes(アノテーション)

1#[Route('/api/users', methods: ['GET'])]
2#[Middleware('auth')]
3class 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
2FROM php:8.2-fpm-alpine
3
4# 拡張機能インストール
5RUN docker-php-ext-install pdo pdo_mysql opcache
6
7# OPcache設定
8COPY opcache.ini /usr/local/etc/php/conf.d/
9
10# Composer
11COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
12
13WORKDIR /var/www/html
14COPY . .
15
16# 本番用最適化
17RUN composer install --no-dev --optimize-autoloader
18
19CMD ["php-fpm"]
1# docker-compose.yml
2version: '3.8'
3services:
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