PHP5.1.0 以降で発生するDATE関数エラー


GArR をダウンロードしたらファイルがぶっ壊れていたとユーザから報告を受けた。


直リンクせず PHP ファイル経由でダウンロードさせていたのだけど、zip ファイルがぶっ壊れているって報告はあまり良い予感がしないため、これは優先して原因を探すことにした。夜中に。メールなんか見るから……。

破損したZIPファイルのバイナリヘッダをチェック

Zip が改竄された可能性を危惧。これはサーバに侵入され改竄された可能性もあるので一番最悪なケースである。

まずダウンロードしたファイルは報告通り zip がアーカイバで開けない。しかし zip が仮に途中からどこか破損していてもファイルリストくらいは取得できるはずなのだけどファイルリストも取得できなかった。というわけでまずファイルのバイナリヘッダを確認することにした。

バイナリヘッダを見たらすぐに原因は分かった。

PHP のエラーメッセージが zip ファイルと一体化して転送されている。PHP 側でエラーが発生して、この警告メッセージまで含めてユーザにファイルとしてダウンロードさせていたらしい。エラーメッセージのあとに正常な zip ファイルのヘッダを確認。ヘッダに付属しているゴミを取り除けば zip ファイルとしての整合性を取り戻すこともできた。

どうやら侵入者は無かった様子だ。ひとまず安心した。

エラーメッセージ

Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.

初めて見るエラー。PHP の timezone 設定なんか、知らんがな。日時を取得するDATE関数絡みのエラーのようだ。

参考:さくらインターネットのVPS設定マニュアル

PHP 5.1.0 以降から仕様変更が行われ、デフォルトタイムゾーン設定をしないままDATE関数を使用するとエラーが発生。

解決策

php.ini に date.timezone を設定するか、PHP ファイル内に date_default_timezone_set 関数を記述、この二つの解決策があるようだ。

  • php.ini に date.timezone を設定
  • PHP ファイル内に date_default_timezone_set 関数を記述

今回は php.ini に手を加えずに該当する PHP ファイル内に date_default_timezone_set 関数を記述する方法で解決を図った。

date_default_timezone_set('Asia/Tokyo');

これですぐに直った。

報告してくれたユーザへ PM を返してミッション完了。

ISIS のテロ対象にされたかと焦ったぜ、ベイベェ。寝る。


Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です