PHP 5.2.17〜5.3.8がcronジョブを壊す理由を理解していますか?

注 - この問題は解決されましたが、私は理解していないため何が起こっていたのかについての洞察を見つけるためにここに投稿しています。

私の共有ホストのデフォルト設定はPHP 5.2.17です。私が5.3.Xにアップグレードできるかどうか尋ねたところ、彼らは確かに言って、

PHP 5.3のハンドラが、Googleの共有および再販業者のサーバに追加されました。   それを利用したい人。このハンドラを利用するには、   .htaccessファイルに次のコードを追加する必要があります:

Action application/x-hg-php53 /cgi-sys/php53
AddType application/x-hg-php53 .php

現在デフォルトではこれがない理由をさらに詳しく説明するために、   古いPHPスクリプトと新しいPHPスクリプトの互換性の問題が原因です   5.3バージョン。したがって、クライアントのサイトで古いスクリプトを壊さないために、デフォルトのPHPバージョンを5.2.Xにしました。

だから私はそれをして、これがPDOを使って私のサイトを殺したことをすぐに発見しました。 new PDO(); を呼び出すと、ログにクラスが見つかりませんでした。

共有ホストのサポート応答は次のとおりです。

PHP 5.3のインストールではすでにPDOが有効になっています。ここの問題   PHP用のphp.iniに基づいたカスタムphp.iniが原因であるようです   5.2のため、PHP 5.3モジュールの代わりにPHP 5.2モジュールをロードしようとします。

okは合理的だと私は言います、今すぐ先に進んでください!

彼らは.iniファイルを更新し、ハンドラを.htaccessに追加しました。

サイトが正しく読み込まれているようですが、問題が見つかった場合はお知らせください。

これが真実で、メインサイトとPDOが正常に動作していて、5.3.8に入っていることを確認したphpinfo()チェックが数時間後、

PHPの警告:PHPの起動時にダイナミックライブラリ '/ opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdoを読み込むことができません。[p] [16-Dec-2011 03:00:01] so ' - /opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdo.so:未定義シンボル:0行目の不明なgc_remove_zval_from_buffer

cronジョブディレクトリからのエラーログ:

PHPの警告:require_once(../ pghqClasses/PDO.php)[function.require-once]:ストリームを開くことに失敗しました:/ homeにそのようなファイルやディレクトリはありません[

[16-Dec-2011 03:00:01] /XXXXXX/pghqIncs/initCron.php on line 19

そこでもう一度PDOコールが失敗しましたが、今回は cronジョブの場合のみ します。

サポートチームの最終回答は次のとおりです。

PHPスクリプトの相対パスが適切な場所を指していない前に、この動作を見てきました。 PHPのマニュアルによれば、CLI PHPとPHPの他のインタフェースとの違いがCLIである場合、PHPはディレクトリをスクリプトのディレクトリに変更しません。 http://www.php.net/manual/en/features.commandline .differences.php   これを修正するために、次の行を追加しました:

     

chdir(ディレクトリ名( FILE ));

     

を実行すると、スクリプトのディレクトリに変更されるので、相対パスが動作するように、cronスクリプトの先頭に移動します。ウェブサイトから実行すると、この行は基本的に何もしませんが、あなたのcronjobが正しく動作するはずです。

そして、それは実際に動作します。私のcronジョブはスムーズに実行されていて、私のメインサイトは良好で、誰もが5.3.8でうれしいですが、最後のトラブルシューティングは私を失ってしまいました。 cronではなく、 public_html スクリプトではなく、 chdir()などの理由からですか?

ありがとう、長さについては残念です...

2

1 答え

問題は、コマンドラインPHP実行可能ファイルを使用する cron ジョブが、PHP実行可能ファイルの場所として現在のディレクトリ、またはジョブを実行しているアカウントのホームフォルダで実行されていることです。したがって、スクリプト内の相対パスは、そのスクリプトが格納されているディレクトリではなく、その場所を基準にして解決されます。

chdir()の呼び出しを追加すると、現在のディレクトリをスクリプトが想定している場所に設定しているため、相対パスが正しく解決されます。

1
追加された
Andrewにありがとう。 /pghqIncs/からのインクルードにもかかわらず、メインサイトが/public_html/からなぜ動作したのか説明してください。 ?それは本当に私を混乱させる部分です。
追加された 著者 Drew,
私はPHPの設定に精通していませんが、私の推測では、php.iniなどの設定ラインがあります。
追加された 著者 Andrew Cooper,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com