ギリギリ行けるお一人様のライン

Windows/AN HTTPDでPHP Version 4.4.9を動かしています。

fsockopenで処理を行なっているのですが、
タイムアウト時に次の処理に移行させる方法が分かりません。

foreachで繰り返し処理中にタイムアウトが出た場合、そこで処理が止まってしまいます。
(エラー内容: Maximum execution time of 30 seconds exceeded)

set_time_limitを使った時間延長以外の方法で、
何か対策がありましたらご教授いただけませんでしょうか。
よろしくお願いいたします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます!

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

ありがとうございます!!!

お礼日時:2009/09/11 16:49

<?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);
}

?>

こんな感じでしょうか。
つまり処理の開始時間と、処理が一回終わるごとに、毎回開始時間から何秒経過したかを算出して、時間が超えていたらループを抜けるとかそういう処理を行えばよいのではないでしょうか。
一回のループ毎の処理が重いのであれば、処理中に何回か算出したりとか、微調整は必要そうですが。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます!
「時間が超えていたらエラー」なんてできるとは!知らなかったです。

今回はループ中に「FatalError(致命的なエラー?)」が出ていたみたいで、この方法が使えませんでした。

次回、処理回数の多いスクリプトを組むときに参考にさせていただきます。
ありがとうございます!

お礼日時:2009/09/11 16:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報