
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で質問しましょう!
似たような質問が見つかりました
- Windows 10 管理者権限 2 2022/05/26 11:08
- PHP PHPの変わった閉じタグの必要性と意味を教えてください。 1 2022/08/28 15:15
- 事件・犯罪 脅迫罪や暴行罪の時効および告訴期間中の安全対策について 2 2022/08/30 15:10
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- 財務・会計・経理 法人成りについて教えてください 個人事業主から法人になったときの、資産の処理の仕方で教えていただきた 7 2022/09/21 17:32
- 英語 Systematic reviews have evaluated the efficacy of 2 2022/05/18 16:39
- 法学 不正アクセス禁止法の扱いについて 4 2022/03/23 18:13
- 教えて!goo 同じ質問を繰り返す投稿者 6 2022/05/24 11:44
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
php.iniの見方
-
phpでのメール送信
-
header('Content-type: ima
-
画像のファイルアップロード
-
PHP言語について
-
foreachで取り出したデータをメ...
-
数千人分のユーザIDを各メール...
-
ファイル一覧を表示しその画面...
-
zampp PHPでPOSTの変数が返っ...
-
MovableTypeでカテゴリー、月別...
-
アクセスログの様なCGI
-
phpとpostgresを利用した検索シ...
-
phpにcssを適応させたい...
-
php-5.2.5がインストールできま...
-
Wordpressへのリモート投稿につ...
-
テキストエリアの内容がメール...
-
sendmailでエラーがでます
-
現在位置より2つ上のディレク...
-
画像の削除をボタンを押したら実行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
phpの処理中に画面表示ををする...
-
インスタンス化に伴うメモリ消...
-
PHP内、ボタン押下と同時にリロ...
-
PHPで偶数と奇数を判断するには
-
PHPが処理を途中でやめる。原因...
-
Cronで同じ処理を複数同時に実...
-
PHPExcel処理速度が遅い
-
VBAからPHPを実行(キック)したい
-
if()にかんして
-
関数の前にアットマークが付く場合
-
オブジェクトの中の関数を共通...
-
◆バックエンド処理の終了を知り...
-
文字列の10+10を20と表示したい
-
タイムアウト処理?となる
-
タイムアウト時に次の処理へ移...
-
PHPでのgoto文の実現方法
-
Smartyにて、文字検索
-
入れ子になっているHTMLタグも...
-
大量チェックボックスの実装方...
おすすめ情報