4

サーバーへのリモート接続を行うクラスを使用しています。私が直面している問題は、接続が応答を取得しない場合、応答が得られるまで待機することです。

このクラスにはタイムアウトが組み込まれていないため、回避できる場合は変更したくありません

このようなコードのセクションをラップする方法はありますか?

try(timeout seconds){
}catch(){
    //exception handle
}timeout(){
    // timeout handline
}

編集:リモート接続を1つの問題として使用します。exec を使用したシステム コールの作成など、これで解決する必要のある問題が他にもあります。

4

1 に答える 1

2

コードの一部だけではありません。

ただし、要求に応じて、元のコードを変更せずに、別の解決策があります。

set_time_limit

set_time_limit()スクリプトの実行時間が長すぎると、スクリプト全体が中止されます。シャットダウン機能を設定することもできます。

pcntl_alarm

pcntl_alarm()は、指定された時間が経過するとシグナルを送信します。これにより、クラスがその時点で実行しているブロッキングシステムコールが中止される場合があります。これにより、そのようなメソッドが提供されている場合は、クラスに操作を中止するように依頼できます。ただし、これはWebサーバー環境には適さない場合があります。

デフォルトのタイムアウト

クラスがストリーム関数を使用している場合、デフォルトのタイムアウトを設定できる場合があります。

ini_set('default_socket_timeout', 5);
stream_context_set_default(array(
    'http' => array(
        'timeout' => 5, 
    ),
));

別のプロセスで実行する

でフォークすることもできますがpcntl_fork()、これはサーバー環境には適していません。

また、PHPスクリプトを別のプロセスで使用proc_openまたはpopen実行して、実行時間が長すぎる場合はそれを強制終了することもできます。(プロセスが生成された後、プロセスのstdoutストリームでアイドル待機を実行しstream_selectます。)

または、これらのタスクを処理するためのサーバーをセットアップします。

于 2011-08-15T15:53:36.837 に答える