- 締切済み
php実行中に実行中のphpファイル書き換えた場合
php実行中に実行中のphpファイル書き換えた場合 書換え後の時点で、書換え対象ステップが未実行で、 書換え後以降にそのステップが読まれた場合、 書換え前のステップが実行されますか? それとも書換え後のステップが実行されますか? すみませんが、回答よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
ちなみに、すでに回答のあるように、実行されるのは「書き換え前」の 結果でおおむねよろしいかと思いますが 外部ファイルを利用していると、取り込み時点の値が反映されます //hoge.php <?PHP print "hoge"; sleep(5); include "fuga.txt"; ?> //fuga.txt fuga これをhoge.phpを実行時に5秒以内にfuga.txtを書き換えれば あたらしいfuga.txtの値が表示されるということです。 つまりは、何がおきるかわからないので書き換えによる影響がでない もしくは影響がでても問題がおこらない方法で運用が必要だということです。
>> 回答ありがとうございます。 >> リンク先のkmee さんの回答が正しければ、 >> PHP実行時に、修正前のソースコードを元に変換した中間言語が生成され、それを処理するので、 >> 修正後のソースコードの内容は処理される事はないのですね。 そうですね。但し、もし中間言語変換が無ければ、No.2さんの回答のように「デーモン実装に依存する」が正しいと思います。 >> 「プログラムの中に」 >> とは、 >> 「実行中の中間言語の中に」という意味でしょうか? 「__halt_compiler(); 以降のデータも中間言語中に埋め込まれているかどうか?」 という質問でしょうか? http://3v4l.org/B9kQv これで「VLD Opcodes」や「HHVM Bytecode」を確認したところ、中間言語には入ってない感じがしますね…
PHPのインタプリタによって1行ずつ実行されるのは、元のソースコードではなく変換された中間コードです。最初に全てが一度中間コードに変換されるため、変換前のスクリプトに手を加えたところで現在実行中の中間コードには何も影響を与えないはずです。 関連: http://okwave.jp/qa/q6652625.html PHPには __halt_compiler() という関数(のようで関数じゃないもの)が用意されており、これと定数 __COMPILER_HALT_OFFSET__ を組み合わせて使えば、プログラムの中にデータを埋め込むことが可能です。もちろんあまりやるべきではないですが。 以下の例では、実行するごとに最後の数字が1ずつ増えていきます。 <?php $fp = fopen(__FILE__, 'a+b'); fseek($fp, __COMPILER_HALT_OFFSET__); $data = (int)stream_get_contents($fp) + 1; ftruncate($fp, __COMPILER_HALT_OFFSET__); fwrite($fp, $data); fclose($fp); __halt_compiler();0
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>書換え前のステップが実行されますか? >それとも書換え後のステップが実行されますか? phpデーモンの実装に依存します。 つまり「何が起こるか判らない」です。 phpデーモンが「スクリプトファイルを実行中は、書き換え不可で排他オープンしている」と言う実装の場合、書き換え用にオープンしようとした時点でエラーになり、書き換え行為そのものが実行できません。 phpデーモンが「スクリプトファイルをオープンしてメモリにすべて読み込んで、読み込み直後にクローズして、ファイルを開放してから実行している」と言う実装の場合、書き換えしても、何の影響も与えません。 phpデーモンが「スクリプトファイルを、1行実行するごとに、1行づつ読み込んでから実行している」と言う実装の場合、書き換えすると、何が起こるか判りません。 「1行づつ読む」と言っても、実際には「現在のファイルポインタから改行コードまで読む」です。 書き換え後に「現在のファイルポインタ」が、行の途中、例えば、ワイド文字列の漢字コードの途中を差していた場合、そのポインタから続きを読むので、文字列の漢字の途中の、解読不明な文字から読み始めるでしょう。 そうなったら、phpデーモンは「スクリプトエラー」を吐いて止まるでしょう。 phpデーモンが、実際にどういう実装をすべきなのかは「仕様として決まってない」ので、ぶっちゃけ「そういう事はやってはいけない」です。「何が起こるか判らない」ですからね。
お礼
回答ありがとうございます。 「phpデーモンが、実際にどういう実装をすべきなのかは「仕様として決まってない」」 と言うことは、「何が起こるか分からないので、実行中は書換えてはいけない」 ということですね。
- t_ohta
- ベストアンサー率38% (5238/13705)
基本的には書き換え前のファイルの内容が実行されます。
補足
回答ありがとうございます。 大多数の方の意見が、お答えの通りでした。
補足
回答ありがとうございます。 リンク先のkmee さんの回答が正しければ、 PHP実行時に、修正前のソースコードを元に変換した中間言語が生成され、それを処理するので、 修正後のソースコードの内容は処理される事はないのですね。 「プログラムの中に」 とは、 「実行中の中間言語の中に」という意味でしょうか?