
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
ちなみに、すでに回答のあるように、実行されるのは「書き換え前」の
結果でおおむねよろしいかと思いますが
外部ファイルを利用していると、取り込み時点の値が反映されます
//hoge.php
<?PHP
print "hoge";
sleep(5);
include "fuga.txt";
?>
//fuga.txt
fuga
これをhoge.phpを実行時に5秒以内にfuga.txtを書き換えれば
あたらしいfuga.txtの値が表示されるということです。
つまりは、何がおきるかわからないので書き換えによる影響がでない
もしくは影響がでても問題がおこらない方法で運用が必要だということです。
No.4
- 回答日時:
>> 回答ありがとうございます。
>> リンク先のkmee さんの回答が正しければ、
>> PHP実行時に、修正前のソースコードを元に変換した中間言語が生成され、それを処理するので、
>> 修正後のソースコードの内容は処理される事はないのですね。
そうですね。但し、もし中間言語変換が無ければ、No.2さんの回答のように「デーモン実装に依存する」が正しいと思います。
>> 「プログラムの中に」
>> とは、
>> 「実行中の中間言語の中に」という意味でしょうか?
「__halt_compiler(); 以降のデータも中間言語中に埋め込まれているかどうか?」
という質問でしょうか?
http://3v4l.org/B9kQv
これで「VLD Opcodes」や「HHVM Bytecode」を確認したところ、中間言語には入ってない感じがしますね…
No.3
- 回答日時:
PHPのインタプリタによって1行ずつ実行されるのは、元のソースコードではなく変換された中間コードです。
最初に全てが一度中間コードに変換されるため、変換前のスクリプトに手を加えたところで現在実行中の中間コードには何も影響を与えないはずです。関連: http://oshiete.goo.ne.jp/qa/6652625.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
この回答への補足
回答ありがとうございます。
リンク先のkmee さんの回答が正しければ、
PHP実行時に、修正前のソースコードを元に変換した中間言語が生成され、それを処理するので、
修正後のソースコードの内容は処理される事はないのですね。
「プログラムの中に」
とは、
「実行中の中間言語の中に」という意味でしょうか?
No.2
- 回答日時:
>書換え前のステップが実行されますか?
>それとも書換え後のステップが実行されますか?
phpデーモンの実装に依存します。
つまり「何が起こるか判らない」です。
phpデーモンが「スクリプトファイルを実行中は、書き換え不可で排他オープンしている」と言う実装の場合、書き換え用にオープンしようとした時点でエラーになり、書き換え行為そのものが実行できません。
phpデーモンが「スクリプトファイルをオープンしてメモリにすべて読み込んで、読み込み直後にクローズして、ファイルを開放してから実行している」と言う実装の場合、書き換えしても、何の影響も与えません。
phpデーモンが「スクリプトファイルを、1行実行するごとに、1行づつ読み込んでから実行している」と言う実装の場合、書き換えすると、何が起こるか判りません。
「1行づつ読む」と言っても、実際には「現在のファイルポインタから改行コードまで読む」です。
書き換え後に「現在のファイルポインタ」が、行の途中、例えば、ワイド文字列の漢字コードの途中を差していた場合、そのポインタから続きを読むので、文字列の漢字の途中の、解読不明な文字から読み始めるでしょう。
そうなったら、phpデーモンは「スクリプトエラー」を吐いて止まるでしょう。
phpデーモンが、実際にどういう実装をすべきなのかは「仕様として決まってない」ので、ぶっちゃけ「そういう事はやってはいけない」です。「何が起こるか判らない」ですからね。
回答ありがとうございます。
「phpデーモンが、実際にどういう実装をすべきなのかは「仕様として決まってない」」
と言うことは、「何が起こるか分からないので、実行中は書換えてはいけない」
ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPからlhaコマンドを使いたい
-
PHPファイルの暗号化(難読化)...
-
phpからエクセルのマクロを実行...
-
php実行中に実行中のphpファイ...
-
Switch文における、returnとbre...
-
PHP5で名前空間を取り扱う
-
phpのheader("Location:#pos")...
-
PHPのif文でその処理を途中で抜...
-
Apache 2.4でphp-5.3を使いたい...
-
phpの中でphpを書けないか
-
require_once()でファイルが読...
-
header(Location:~)で$_SESS...
-
さくらインターネットでメール...
-
フォームで戻った際に入力済み...
-
PHPでメールを受信するには?
-
php4とphp5での数値の取り扱い...
-
PEAR(Image_QRCode)のエラー
-
テレメールとは?
-
再度、xamppにおけるjpgraphの...
-
<A href ~ と一緒に値を渡すには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルスクリプトをPHPで動かそ...
-
mysql複数レコードをまとめて削...
-
copy() で属性保存
-
require_onceが動いていない
-
php実行中に実行中のphpファイ...
-
サーバの作業の流れで質問です。
-
コマンドラインの生成でParse e...
-
system()でssh命令文の実行結果...
-
phpからエクセルのマクロを実行...
-
Prompt入力値をphp変数として取...
-
PHPからlhaコマンドを使いたい
-
PHPにてC言語プログラムを呼び...
-
一時停止のコマンドはありますか?
-
社内LANで複数台のPCからApache...
-
execからのls grepコマンドにつ...
-
ヒアドキュメントの中で演算子...
-
httpdのプロセスが自動で消えな...
-
PHPファイルの暗号化(難読化)...
-
コマンドライン実行でDBにアク...
-
phpの実行ユーザーは設定できま...
おすすめ情報