
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ランキング
-
PHPについて基本的なこと
-
if文が入れ子の場合の条件の解釈
-
httpdのエラーログをwebでリア...
-
PHPでMysqlにデータがあるかど...
-
require_onceが動いていない
-
プログラム単語のsetageとかのa...
-
PHPでコマンドプロンプトを実行...
-
mysql複数レコードをまとめて削...
-
phpをオフラインで動かしたい
-
phpでお問い合わせフォームを作...
-
初めまして、
-
ファイルシステム関数関係
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
引数を正しく読み込む方法
-
session_startでクッキー範囲を...
-
プログラミング作業効率を上げ...
-
microSDの装着による連続待受時...
-
Content-Typeが機能していない?
-
PHPを
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql複数レコードをまとめて削...
-
シェルスクリプトをPHPで動かそ...
-
PHPでコマンドプロンプトを実行...
-
require_onceが動いていない
-
ヒアドキュメントの中で演算子...
-
PHPでサーバーにインストールさ...
-
php実行中に実行中のphpファイ...
-
社内LANで複数台のPCからApache...
-
ブラウザからexecコマンドを実...
-
PHPからバッチファイルの実行
-
Switch文における、returnとbre...
-
PHPからPostgreSQLのダンプを実行
-
正常に動作しない
-
htmlでsubmitで指定したAction...
-
PHPファイルをcronで実行す...
-
[cakePHP]外部ファイルの実行方法
-
テルネットしコマンドを自動実行
-
copy() で属性保存
-
PHP+MySQLでrollback出来ない
-
入力してからn時間(日)後、DBデ...
おすすめ情報