2016-12-14 4 views
2

私は小さなコード例にそれを減らすことができますincludeはPHPのインクルードコマンドがバッファされていますか?

でいくつかのファイルをinlcudingと私のスクリプトでいくつかの問題をしました:

<?php 

$res = 0; 
include "test.txt"; 
echo "RES = > $res".PHP_EOL; 

file_put_contents('./test.txt','<?php $res='.($res+1).';'.PHP_EOL); 

include "test.txt"; 
echo "RES = > $res".PHP_EOL; 

私は

RES => 0 
    RES => 1 
    //On next Call I'm expecting ... 
    RES => 1 
    RES => 2 
の出力を期待してい

しかし、私が得ているもの:

RES => 0 
    RES => 0 

次の呼び出しでも同じResult(RES => 0)が返されます。スクリプトを1〜2秒後に呼び出すと、RESの増分が得られます。

私の質問:PHPのインクルードステートメントはバッファされていますか?私はバッファリングについてphpのドキュメントにいくつかの部分を見ていません。私の例の問題は何ですか?

+0

(v2.4.18/7.0.8-0ubuntu0 .16.04.3) – powerpete

+0

私は複製できません。 – AbraCadaver

+0

あなたのコードはうまくいきます。このパスの下で、 'www-data'ユーザが** write **権限を持っていることを確認してください。また、php.iniでエラーを表示して、今後の問題に関する詳細情報を取得してください。 –

答えて

0

コマンドラインから、または無効opcacheで例を実行すると、スクリプトが正常に動作します:既存のfile_put_contents呼び出し後にこのような何か。

opcacheを無効にすると正しい結果が得られます。 有効opcacheと回避策は、この(これはファイルをキャッシュ防ぐことができます)のようになります。私はUbuntuの下、標準のPHP/Apacheのインストールで働いている

//Instead of include "test.txt"; 
//we include the part manual by eval 
$cont = file_get_contents("test.txt"); 
//Strip of leading <?php and eval the string 
eval(substr($cont, 5)); 
1

OPCodeキャッシュがインストールされているかどうかによって異なります。スクリプトを実行すると、最初からメモリからロードされます。

OPCodeキャッシュがない場合の動作についてはわかりません。 includeを呼び出すたびに、PHPがディスクからファイルを読み込む可能性があります。あなたはstraceなどで見つけることができます。 includeの次の呼び出しでPHPがディスクに戻っても、おそらくファイルシステムのキャッシュの利点があります。

一般に、私はOPCodeキャッシュの使用を推奨します。私は今あなたが二include前にファイルの内容を変更している参照

EDIT

...私はCLIからあなたの例を試してみた、あなたが期待するとして、それが働いています。 CLI経由でサーバー上で試してみてください。それがうまくいくならば、OPCodeキャッシュが有効になっている可能性が高く、特定の構成が期待される動作を妨げている可能性があります。

また、Apacheが更新されたファイルを期待通りに書き出していることを確認する必要があります。たぶん、file_put_contentsでディスクに書き込むと、ログに、生成されたファイルの各バージョンの内容が記録されます。

// For logging 
file_put_contents('./test-' . time() . '.txt','<?php $res='.($res+1).';'.PHP_EOL); 
関連する問題