-
- class Test {
- public function __construct(){
- $this->_log('start')
- }
-
-
- public function __destruct () {
- $this-> _log('finish');
-
- public function _log ($str) {
- error_log($str . "n", 3, './log.log');
- }
- }
- $test = new Test;
- ?>
-
コード
をコピーすると、log.log には start だけがあり、finish がないことがわかりました。
ログの内容をクリアした後、プログラムを再度変更します。
unset($test);
案の定、始まりと終わりがありました。
__destructはunset後にのみ実行されるようです。
しかし、問題はまだ終わっていません。プログラムを再度変更し、__destruct 関数を変更し、未設定のコードを削除しました。
- public function __destruct () {
- echo 'finish';
- $this->_log('finish') }
- ?>
-
-
コードをコピーします
このとき、実際に画面には「finish」と表示されており、デストラクタが確実に実行されたことが証明されました。
困惑した後、インターネットで情報を探し始めたところ、友人のデストラクタで error_log が使用され、実行されているのを知りました。私の使用法との違いは、彼が error_log ファイルを指定せず、デフォルトに設定していることです。ログファイルがあるので、それをシミュレートしてプログラムを変更しました。
public function _log ($str) { - error_log($str . "n");
- error_log($str . "n", 3, './log.log') ;
- }
- ?>
-
-
-
コードをコピー
start後もlog.logが開始されていることがわかりましたが、終了はありませんでした。
そして、E:AppServApache2.2logserror.log (私の Apache 構成のデフォルトのログ ファイル) には、実際には開始と終了があります。
奇妙な質問だったので、私は理解できなかったので、グループに行って質問しました。グループの友達は、文法上の間違いがないか確認するか、ファイルのアクセス許可に問題がないことを確認するように頼みました。この二つ。
私は、「Windows システムに権限の問題はありません。これが原因であることは間違いありません。」と言いました。
グループの友人は、「windos システム、説明がありません!」と言いました。
私は「これはシステムとは何の関係もないはずです。Apache の問題ではないかと思います。」と言いました。
そこで、_log を復元し、linux+nginx 仮想マシン上で実行しました。
public function _log ($str) { - error_log($str . "n", 3, './log.log') }
- ?>
-
-
-
- コード
log.logをコピーすると、開始と終了が正常に書き込まれます。
これにより、自分の判断がさらに疑わしくなります。原因は Apache です
そこで、1時間苦労してサーバーにApacheをインストールしてファイルを実行しましたが、結果は同じで、正常に書き込まれませんでした。
この時、同僚に「絶対パスを書いてみて」と言われたので、別の_logを修正しました
public function _log ($str) { error_log($str . "n", 3, '/var/www/apache/log.log') } ?> ; コードをコピーします もう一度見て、「終了」と書きます。やっと問題が見つかったので、プログラムを修正しました。
public function __construct(){ echo getcwd(). ;br />' - }
- ?>
-
-
- 実行結果を表示します。 :
/var/www/apache
/
-
- nginx サーバーで実行し、結果を取得します。
/var/www/apache
/var/www/apache
-
- Apacheのデストラクタは現在のプログラムのディレクトリを変更することが判明したため、相対ディレクトリを使用すると該当するファイルが見つからず、当然書き込みに失敗します。
言語を学ぶのは簡単ではありません。もっと練習することが大切です。
-
|