綺麗に死ぬITエンジニア

特定のPHPアプリケーションがきちんと動作しないときの対処法

2015-02-12

単純な原因でしたが、原因がわかるまで相当かかってしまったので、備忘録として。

現象

CentOS 6および7とDebian 7.8にて、他のCentOS 6が稼働するサーバーから移行してきたPHPのWebアプリケーションが動作しませんでした。空白(真っ白)のページが表示されたり、タイムアウトしたり、フレームワークのテンプレートのみ表示されたり……。

CentOS 6では、CakePHPのDispatcherクラスが正常に読み込めていないらしく、以下のログが"/var/log/httpd/error_log"に出力されていました。

[date] [error] [client XXX.XXX.XXX.XXX] PHP Fatal error:  Class 'Dispatcher' not found in /var/www/html/app/index.php on line 103

CentOS 7では以下のログが"/var/logs/httpd/error_log"に出力されていました。

[date] [mpm_prefork:notice] [pid 16038] AH00170: caught SIGWINCH, shutting down gracefully
[date] [suexec:notice] [pid 1001] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[date] [auth_digest:notice] [pid 1001] AH01757: generating secret for digest authentication ...
[date] [lbmethod_heartbeat:notice] [pid 1001] AH02282: No slotmem from mod_heartmonitor
[date] [mpm_prefork:notice] [pid 1001] AH00163: Apache/2.4.6 (CentOS) PHP/5.4.16 configured -- resuming normal operations
[date] [core:notice] [pid 1001] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'

Debian 7.8では、単に以下のログだけが"/var/log/apache2/error.log"に。

[date] [notice] caught SIGTERM, shutting down

原因

上記の現象の原因は全て、単純にphp.iniの設定不足でした。利用できるメモリの量に制限を与える、memory_limitの値が少なく、うまく動作できていなかったようでした。

実はPHP自体で以下のエラーを吐いていたようなのですが、あまりにもメモリが不足していると、そのエラーを出力できないこともあるようです。

PHP Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes) in …

対処

php.iniのmemory_limitの値を変更します。php.iniは、CentOSでは"/etc/php.ini"、Debianには"/etc/php5/apache2/php.ini"にあります。

memory_limit = 1024M
;上のように適切な値を割り当てるか、
memory_limit = -1
;上のように記述し上限をなくします

設定後は、Apacheの再起動を忘れずに。

apachectl restart

まとめ

httpd.confばかり見ていたので、php.iniは盲点でしたとさ。

筆者について

フリーランスエンジニアとして活動している、「もりやませーた」です。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

PHP