learn久しぶりに過去に制作したCakePHP1.2環境のWebアプリの修正作業をしていたら、Deprecatedエラーが大量に表示されていたのでその対応のまとめ。

開発環境のUbuntu Serverを途中でアップデートしてPHP5.3系にしたので、以前一応対応したつもりだったのですが、CakePHP1.2系でshell実行の部分は別に対応が必要だったみたいです。

検索の仕方が悪かったのかもしれませんが、検索しても有益な情報があまりなかったのでメモしておきます。

Deprecatedの表示について

Deprecated: Assigning the return value of new by reference is deprecated

まずは、上記のDeprecatedの表示はなんで出ているのかを知らないと解決しても意味が無いので、メモしておきます。

あたりを参考にすると、

E_DEPRECATED
実行時の注意。これを有効にすると、 将来のバージョンで動作しなくなるコードについての警告を受け取ることができる。

ということで、PHPが5.3になって非推奨になった関数を使っている部分にDeprecatedの警告が出ている、という事のようです。

対応としては、非推奨の関数を推奨する関数に置き換えたり、引数を変更したりする必要があります。しかしソース全体に手を入れるのは難しいので、とりあえず非表示にして対応している場合が多く、私の環境でもその「とりあえず非表示」の対応をしました。

CakePHP1.2系のWebアプリへの対応

具体的な対応方法は以下の情報を元にソースを修正をします。
(これは過去に自分でも対策していた)

「cake/libs/configure.phpの290行目あたりに下記の処理を入れればDeprecatedエラーが出なくなる。」

if (isset($config['debug'])) {
 if ($_this->debug) {
  error_reporting(E_ALL);
  //この下のIF文を追加する
  if (error_reporting() > 6143) {
   error_reporting(E_ALL & ~E_DEPRECATED);
  }

これでとりあえず、デバッグ時もブラウザには大量に表示されなくなりました。

以前はここまで対応していて、解決していたつもりだったのですが、今回はそうは行きませんでした。

CakePHP1.2系のshellアプリの対応

修正しているアプリでcronで定期的に実行しているshellコマンドもあったので、そちらを確認するとまったく消えていない。

検索してみても、

みたいに、cli用のphp.iniを変更しても効果がなくバージョンを落とす、ということで解決している場合が多いようでした。実際私の環境(Ubuntu server)もcli用のphp.ini(/etc/php5/cli/php.ini)を変更しても効果がありませんでした。

が、しかし、今回は他の開発環境も兼ねているのでバージョンを落とせない。仕方なくCakePHPのコア部分のソースから追ってみたところ、あっさりと簡単に解決しました。ソースの中でerror_reportingをE_ALLで決め打ちしてるところが有りました、うーんなんだかな…。

cale/console/cake.php
141行目あたりの「E_ALL」に「 & ~E_DEPRECATED」を追加します。

  function __initConstants() {
if (function_exists('ini_set')) {
ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL & ~E_DEPRECATED);
ini_set('html_errors', false);
ini_set('implicit_flush', true);
ini_set('max_execution_time', 0);
}

これで、表示されなくなると思います。