![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
PHPスクリプト内にて、ある処理が例えば30秒以上かかった場合は、その瞬間にexit()やエラーをecho()というような
実装をしたいと思うのですが、どのように書けばいいのか思いつきません。
function hoge() {
/* 処理内容 */ //α
return $foo;
}
$foo = hoge(); //β
があった場合、どこに、どのように書けばいいのでしょうか?
簡単に書けば、
$time = time();
if(time() - $time >30) {
echo "時間超過";
}
のような時間的処理分岐を入れたいと思うのですが。
αやβの前に$time = time();を置いたとしても、αの"処理内容"やβの関数実行の後にif(){}節を入れることになるので、
逐次処理のせいで、処理が15分かかった後とかにエラー出力とかになってしまいます。
自分は、何かをスクリプト中で実行し、その処理が30秒を超えた場合はエラーを出したいと考えております。
上記のような分岐方法でなくてもいいのですが、どのように書けばいいのかアドバイス頂けないでしょうか?
No.3ベストアンサー
- 回答日時:
マニュアルに
while setting the set_time_limit(), the duration of sleep() will be ignored in the execution time.
ってあるので、sleep()で実験したのではだめなようです。
ためしに
<?php
set_time_limit(2);
for ( $i = 0 ; $i < 40; $i++) {
echo "$i:<BR>\n";
for($j=0;$j<200000;$j++) $k=$i+$j;
}
?>
で実験してみると、、
PHP Fatal error: Maximum execution time of 2 seconds exceeded in {パス} on line 5
のエラーをだしてちゃんと2秒超えたあたりで処理を中断してくれました。
(エラー出すださないは、別途制御できますが)
No.2
- 回答日時:
set_time_limit();
http://php.net/manual/ja/function.set-time-limit …
を使うのが簡単だと 思います。
コールした時点からの経過時間の設定なので
αの処理を最大30秒に制限
βの処理を最大30秒に制限
とそれぞれ設定したいなら、
set_time_limit(30);
α処理
set_time_limit(30)
β処理
って感じです。
タイムアウトしたときにメッセージを出したいなら
register_shutdown_function() で終了時に自動実行するfunctionを登録して、
そのなかで、本来の処理の最後で代入するglobalのフラグ変数をみて、
フラグがセットされてないときは、タイムアウト処理時だとして
その場合のみメッセージを出すようにしてはどうでしょう。
お答え頂きましてありがとうございます。
set_time_limit()を使うという発想はありませんでした。
一応自分でCLIにて(自分は最近CLIで使うことが多いもので)書いてみたのですが、
何故か自分の環境ではset_time_limit()が思ったような挙動をしませんでした。
セーフモードでもないのですが。
<?php
if( !ini_get('safe_mode') ){
set_time_limit(5);
} else {
die("safe_modeですよ\n");
}
function aaa() {
for($i=0; $i<10; $i++) {
echo $i . "秒経過\n";
sleep(1);
}
}
aaa();
サンプルがいまいち良く分からなかったので、単純にこんな感じで買いてみたのですが、
5秒以上かかっても普通に実行されておりました。
使い方が悪いのかもしれませんが。
No.1
- 回答日時:
αの具体的な内容や、時間がかかる理由によって、
適切な書き方はまちまちです。
基本的な考え方としては、αの処理を細切れにして、
都度、時間チェックをしてタイムアウト処理をする必要があります。
ループがあれば、その中で毎回時間をチェックして、
30秒を経過した時点で処理を打ち切ります。
また、単体で時間がかかる恐れのある関数には、
多くの場合、タイムアウトを指定するオプションや、
ノンブロッキングモードが提供されています。
例えば http の file_get_contents() であれば、
stream_context_create() で timeout オプションを指定します。
ftp_get() であれば ftp_nb_get() に置き換えます。
ソケット通信であれば stream_set_timeout() や
stream_set_blocking() を使います。
最後に、あまり推奨できませんが、
pcntl_alarm() を使う方法もあります。
─
$tout=false;
declare(ticks=1);
function sig($sig){global $tout; $tout=true;}
pcntl_signal(SIGALRM, 'sig');
pcntl_alarm(30);
while(!$tout){echo '.'; sleep(1);}
echo "done.\n";
お答えいただきありがとうございます。
確かに単体で時間のかかる処理は時間制御が指定できますね。
自分はこれらの処理をマルチプロセスやらで色々と絡んだものをやろうと思っておりまして、
そこでそのグループにて時間指定をしようかと思っておりました。
もう一度単体での時間制御を見直してスクリプトを考えてみます。
今まで自分にそのような経験が無かっただけで知らないのですが、例えばDBだとか、PECLのmemcacheとかの接続の際とかで何らかの理由で時間がかかった場合はどうなるのでしょうか?
MySQLなどPDOで書いてると、時間制御の為のオプションとかあったかな?とうろ覚えなのですが。
max_execution_timeとかで指定してある時間が過ぎたりすると、全体的にエラーになって、その後に処理の分岐などは出来るのかな、とか今思ったのですが。
pcntl_alarm()、自分は避けていた面もあるのですが、この際ちょっと学習してみます。
教えていただきありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
Cronで同じ処理を複数同時に実...
-
フォントの色を変えるには?
-
Pear::QuickFormの代わりにな...
-
CFileDialogの最初のディレクト...
-
.phpと.incファイルの違いはな...
-
Subversionのリポジトリの削除
-
透過PNGが透過されない!!
-
受け取ったパラメータを次のphp...
-
zip圧縮の種類について
-
WordPressでテーマのヘッダー画...
-
XAMMPのインストールについて
-
marty3のvariableFilter
-
PHPでネットワークドライブのop...
-
さくらサーバーにて、phpからメ...
-
tmpファイルが消えない
-
HTMLに埋め込んだPHPがうまく出...
-
php文字列中のシングルクオート...
-
phpのクラスにて別ファイルの変...
-
パースエラーとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
PHPが処理を途中でやめる。原因...
-
PHPExcel処理速度が遅い
-
phpの処理中に画面表示ををする...
-
インスタンス化に伴うメモリ消...
-
web画面から呼び出したphp処理...
-
VBAからPHPを実行(キック)したい
-
Cronで同じ処理を複数同時に実...
-
PHPで偶数と奇数を判断するには
-
プログラム内で処理中断後も継...
-
PHP postgres でロールバック...
-
Smartyにて、文字検索
-
関数の前にアットマークが付く場合
-
入れ子になっているHTMLタグも...
-
文字列の10+10を20と表示したい
-
チェックボックスをビット演算...
-
外部ドメインからのPOST送信を...
-
DBへの書き込みとメール送信を...
-
処理時間により、その後の処理...
-
タイムアウト処理?となる
おすすめ情報