
Windows/AN HTTPDでPHP Version 4.4.9を動かしています。
fsockopenで処理を行なっているのですが、
タイムアウト時に次の処理に移行させる方法が分かりません。
foreachで繰り返し処理中にタイムアウトが出た場合、そこで処理が止まってしまいます。
(エラー内容: Maximum execution time of 30 seconds exceeded)
set_time_limitを使った時間延長以外の方法で、
何か対策がありましたらご教授いただけませんでしょうか。
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
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;
}
回答いただきありがとうございます!
>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);
}
?>
こんな感じでしょうか。
つまり処理の開始時間と、処理が一回終わるごとに、毎回開始時間から何秒経過したかを算出して、時間が超えていたらループを抜けるとかそういう処理を行えばよいのではないでしょうか。
一回のループ毎の処理が重いのであれば、処理中に何回か算出したりとか、微調整は必要そうですが。
回答頂きありがとうございます!
「時間が超えていたらエラー」なんてできるとは!知らなかったです。
今回はループ中に「FatalError(致命的なエラー?)」が出ていたみたいで、この方法が使えませんでした。
次回、処理回数の多いスクリプトを組むときに参考にさせていただきます。
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
バッチを用いたフォルダの自動移動
-
$_SESSION 有効期限をブラウザ...
-
SQLiteに画像を格納したい
-
copy() で属性保存
-
拡張子php画像をjpg画像等に変...
-
「クラス関数」「メンバ関数」...
-
require_once()でファイルが読...
-
PEAR Image_QRCodeのエラー
-
system()でssh命令文の実行結果...
-
HPを開くとダウンロードページ...
-
wgetの使い方
-
VB.NETのFTPダウンロードについて
-
Smartのカスタマイズでエラー
-
pictureboxに表示した画像のフ...
-
3つ以上の論理積は利用可能なの...
-
getimagesizeで画像がなかった...
-
SELECTの値を保持する
-
CSV出力にHTMLが入ってしまう
-
ImageCreate関数が undefined f...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
phpの処理中に画面表示ををする...
-
Cronで同じ処理を複数同時に実...
-
PHPExcel処理速度が遅い
-
Smartyにて、文字検索
-
phpの条件文について
-
◆バックエンド処理の終了を知り...
-
PHPが処理を途中でやめる。原因...
-
外部ドメインからのPOST送信を...
-
PHP postgres でロールバック...
-
PHP内、ボタン押下と同時にリロ...
-
大量チェックボックスの実装方...
-
インスタンス化に伴うメモリ消...
-
タイムアウト処理?となる
-
条件分岐 if(elseif) switchの...
-
デバッグの仕方・・・
-
オブジェクトの中の関数を共通...
-
CakePHPでのemptyの 0 判定に関...
-
PHPの%演算子は処理の前に計算...
-
PHPの複数関数非同期実行方法を...
おすすめ情報