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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- その他(スマートフォン・携帯電話・VR) 楽天モバイルからlinemoの乗り換えは自由に切り替えできますか? 2 2022/11/12 08:46
- 預金・貯金 名義預金の名義書き換えについて 閲覧ありがとうございます。名義預金の実質名義人への名義書き換えについ 2 2022/12/05 17:27
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- その他(プログラミング・Web制作) 置換ソフトで指定したファイルの1行目に入力できるものを探しています 7 2022/11/24 10:34
- その他(OS) windows11非対応のインストール 3 2022/10/26 07:12
- 英語 Whether they agree or not,I will carry out the pla 3 2023/07/14 16:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- 家賃・住宅ローン 住宅ローンの完済証明書について 2 2022/09/10 09:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェルスクリプトをPHPで動かそ...
-
phpからエクセルのマクロを実行...
-
php実行中に実行中のphpファイ...
-
別サーバのプログラムを起動
-
eclipseのlocalhostの設定について
-
ヒアドキュメントの中で演算子...
-
【PHP】命令は記述順に処理...
-
mysql複数レコードをまとめて削...
-
PHP フォルダ名やファイル名に0...
-
PHPからCプログラムを実行して...
-
JSのWINOW.CONFI...
-
PHPからlhaコマンドを使いたい
-
PHPの特徴は
-
PHPファイルをcronで実行す...
-
フォントの色を変えるには?
-
PHPのWARNINGをcatchするには
-
onedrive にexcelファイルをア...
-
PHP8を使うと、大量のWarningが...
-
バッチを用いたフォルダの自動移動
-
CSV出力にHTMLが入ってしまう
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
php実行中に実行中のphpファイ...
-
phpからエクセルのマクロを実行...
-
ヒアドキュメントの中で演算子...
-
PHPからバッチファイルの実行
-
【PHP】命令は記述順に処理...
-
シェルスクリプトをPHPで動かそ...
-
Switch文における、returnとbre...
-
httpdのプロセスが自動で消えな...
-
copy() で属性保存
-
Prompt入力値をphp変数として取...
-
JSのWINOW.CONFI...
-
htmlでsubmitで指定したAction...
-
unix(freebsd)でmysqldumpコマ...
-
PHPのsystem()でjava
-
別サーバのプログラムを起動
-
PHPでコマンドプロンプトを実行...
-
社内LANで複数台のPCからApache...
-
PHPからCプログラムを実行して...
-
PHPで、C#のプログラムを実行す...
おすすめ情報