PHP — プログラミング言語の一つ

PHP 8.3 の FPM で error_log が無音になる条件を潰す

PHP 8.3.6、Alpine 3.19 のコンテナ、nginx + php-fpm の構成。FPM のワーカーが 20 前後で回っている決済系のバッチ兼 API で、ある日から 500 が返るのに nginx の error.log にも FPM の error_log にも何も出ない、という状態が半日続いた。アプリ側は set_exception_handler で握ってレスポンスだけ返して

PHP 8.3 で set_error_handler が deprecation を取りこぼす条件と実務での回避

PHP 8.3.4 / Ubuntu 22.04 / nginx + PHP-FPM の構成で、社内の集計バッチを動かしていたときに気づいた話です。データ量は1日あたりの処理行数が数十万、1プロセスあたりのメモリ上限は128M。PHP 8.3 に上げた直後から、ログに `Deprecated: ...` が出ているのにアプリ側のエラーハンドラが拾わず、監視に何も上がらない状態が数日続きました。

PHP 8.3のFPMでpm.max_childrenを動的に調整する手順

PHP 8.3.4、Ubuntu 22.04のFPM環境で、アクセスが急増すると502が頻発する現象に遭遇した。pm.max_childrenを静的に設定していたが、夜間バッチと日中で負荷が全く異なり、固定値では無駄が多い。そこで、負荷に応じて動的に子プロセス数を調整する方法を試した。

PHP 8.2/8.3でPDOのprepared statementが効かない条件を潰す

PHP 8.2.13 + MySQL 8.0.35(InnoDB)、PHP-FPM + nginx の構成で、1リクエストあたり30〜60件のSELECTを叩く画面がある。負荷試験でQPSを上げるとMySQL側の`Com_stmt_prepare`と`Com_stmt_execute`の比率が1:1に近づき、prepared statementがほぼ再利用されていないことが分かった。PDOの`AT

PHP 8.2のFPMでpm.max_childrenを実測から決める手順

PHP 8.2.13 + php-fpm を Amazon Linux 2023、nginx の裏で動かしている環境の話です。ピーク時に 5 分間で約 1,200 req/s、1 リクエストあたりの PHP 実行時間は p95 で 180ms 程度。前任者が設定した `pm.max_children = 200` のまま運用していて、昼のバーストで 502 が散発し、`dmesg` には oom-