9

続行する前に、関数が戻るまでPHPを待機させる方法はありますか?

これは私のコードです:

<?php

    set_time_limit(0);

    function waitforchange($nof) {
        $lfilemod=filemtime($nof);
        while(filemtime($nof) == $lfilemod) {
            clearstatcache();
            usleep(10000);
        }
    }

    waitforchange('./blahblah.txt')
    sleep(5);
    echo 'done';

?>

変更されるまで待機blahblah.txtし、その後さらに 5 秒待ってから「done」を出力するはずですが、ファイルが実際に変更されたかどうかに関係なく、5 秒後に「done」を出力します。

4

3 に答える 3

18

PHPはシングルスレッドです。つまり、次に進む前に一度に1つの命令を実行します。つまり、PHPは、関数が実行を終了するのを自然に待ってから、次のステートメントに進みます。

私は自分のマシンでコードを実行しようとしましたが、関数を完了してメッセージを表示する前に、ファイルを変更するまで適切に待機しました。

コードに失敗している可能性のあるものは何も表示されません。の作成はループ内$lfilemodのチェックと同じ方法で実行されるため、ファイルに問題があった場合でも、whileそのループの条件が返され、実行されます(両方のエラーで返されるため、条件は次のようになります。明らかに)。TRUEfilemtimeFALSE(FALSE == FALSETRUE

PHPスクリプトは、そのループを実行する前にファイルを変更しますか?その場合、によって返される初期値はfilemtime、スクリプトが最初に開始されたときからの変更時刻である可能性があります。ループ内で実行するclearstatcacheと、スクリプトの前半で変更によって生じた新しい変更時間を取得します。

私のアドバイス:

  • clearstatcacheの値を設定する前に実行してみてください$lfilemod。これにより、値がクリーンであり、リンゴとリンゴをループでチェックされているものと比較していることがわかります。

  • ファイルが実際に変更されていないことを確認してください。コードの最初と最後にいくつかのデバッグ行を配置して、ファイルの最終変更時刻を出力してから、2つを自分で比較して、PHPが変更時刻の変更を報告しているかどうかを確認してください。

  • これは言うまでもありませんが、開発中にすべてのエラーを表示するようにPHPが構成されていることを確認する必要があります。そうすれば、問題が発生した時期と方法がすぐにわかります。display_errorsファイルで設定が有効Onになっていることphp.ini(またはini_set()ファイル自体を変更できない場合は使用)、およびPHP <=5.3またはPHP5.4(そのバージョンの一部)にerror_reporting()設定されていることを確認してください。より良い方法は、PHPのバージョンに関係なく、すべてのエラー報告を効果的にオンにするエラー報告を設定することです。E_ALL | E_STRICTE_ALLE_STRICTE_ALL-1

これらの変更を加えて、コードを再実行してみてください。ファイルが実際に変更されていることがわかる場合は、コードが機能していることがわかります。ファイルが変更されていない場合は、少なくとも検索できるエラーがあるか、ここでお問い合わせください。

于 2013-01-18T05:21:46.947 に答える
1

関数呼び出しを変数に割り当ててみてください。それ以外の場合は、リターンを待たないと思います。

于 2013-01-18T05:00:33.677 に答える
0

コードは良さそうです。waitforchange 行の後にセミコロン (;) がないので保存してください。そこに (;) を入れてテストしたところ、スクリプトは意図したとおりに動作しました。おそらくそれが犯人ですか?ただし、そのエラーが発生した状態でコードを実行する方法を説明するには途方に暮れています。

于 2013-01-18T05:00:48.933 に答える