• 締切済み

タイムアウト時に次の処理へ移行する方法

Windows/AN HTTPDでPHP Version 4.4.9を動かしています。 fsockopenで処理を行なっているのですが、 タイムアウト時に次の処理に移行させる方法が分かりません。 foreachで繰り返し処理中にタイムアウトが出た場合、そこで処理が止まってしまいます。 (エラー内容: Maximum execution time of 30 seconds exceeded) set_time_limitを使った時間延長以外の方法で、 何か対策がありましたらご教授いただけませんでしょうか。 よろしくお願いいたします。

みんなの回答

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.2

通信メモ <?php // PHPってタイムアウト設定がめんどいすね function request($host, $path) {   $timeout1 = 10;   $timeout2 = 10;   $errno  = null;   $errstr = null;   $data   = null;      if (!$fp = fsockopen($host, 80, $errno, $errstr, $timeout1)) {     echo "Unable to get server status";     return false;   }      stream_set_blocking($fp, true);   stream_set_timeout($fp, $timeout2);   $info = stream_get_meta_data($fp);   fwrite($fp, "GET {$path} HTTP/1.1\r\n");   fwrite($fp, "Host: {$host}\r\n");   fwrite($fp, "Connection: Close\r\n\r\n");   while (!feof($fp) && !$info['timed_out']) {     $data .= fgets($fp, 4096);     $info = stream_get_meta_data($fp);   }   fclose($fp);      echo '<pre>' . print_r($info, true) . '</pre>';   echo $data; }

systempunk
質問者

お礼

回答いただきありがとうございます! >stream_set_blocking($fp, true); >stream_set_timeout($fp, $timeout2); >$info = stream_get_meta_data($fp); この3行、初めて見る関数でちょっと興奮しました。 調べてみたけど意味が全く分からなかったので、 これからじっくり調べた上で実装してテストしてみます! ありがとうございます!!!

すると、全ての回答が全文表示されます。
回答No.1

<?php $start = microtime_float(); //現在のマイクロタイムを取得 $error = false; //何ぞかのループ処理 while({なにやら条件}){ $fp = fsockopen(); //どこかに接続するとして、 if(!$fp) exit('接続できなかった'); //接続できない場合のエラー処理 //処理を繰り返して、処理の重そうな箇所に適時、 if(microtime_float - $start > $maxtime){ //何らかの終了処理 $error = true; break; } } if($error === true){ echo "エラーがあったことを伝える処理とか"; } function microtime_float(){ list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?> こんな感じでしょうか。 つまり処理の開始時間と、処理が一回終わるごとに、毎回開始時間から何秒経過したかを算出して、時間が超えていたらループを抜けるとかそういう処理を行えばよいのではないでしょうか。 一回のループ毎の処理が重いのであれば、処理中に何回か算出したりとか、微調整は必要そうですが。

systempunk
質問者

お礼

回答頂きありがとうございます! 「時間が超えていたらエラー」なんてできるとは!知らなかったです。 今回はループ中に「FatalError(致命的なエラー?)」が出ていたみたいで、この方法が使えませんでした。 次回、処理回数の多いスクリプトを組むときに参考にさせていただきます。 ありがとうございます!

すると、全ての回答が全文表示されます。

関連するQ&A