質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7688閲覧

【PHP】set_time_limitについて

aokyun

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/08/06 04:06

編集2018/08/06 04:44

PHPの時間がかかるスクリプトでset_time_limit(0)を記述し、タイムアウトしないでほしかったのですが
実際に動かしてみると、画面に「maximum execution time of 30 seconds exceeded」が吐き出されてしまいました。
php.iniにはmax_execution_time=30がセットされております。
また、該当スクリプト中には他にこの設定を操作する記述はなく。もちろん.htaccessにも記述はありません。
phpinfoでも確認してみましたがlocal valueはきちんと「0」になっていました。

この条件の中でなぜこのタイムアウトのエラーが表示されてしまうのか見当がつかなかったため
考えられる可能性など、知恵をお借りしたいです。

※webサーバやブラウザが原因の可能性もあればそれも教えていただけると助かります。

<追記>

// 最大実行時間の設定 set_time_limit(0); // データ配列を作成 $AR = array(); // 実際は別ファイルにてCSVをアップロードし配列に整形している // データ検査 function events_ck_ditail($AR) { foreach($AR as $key => $value){ // データの型や形式、DBとの整合性などを検査 } return; } function events_regist() { global $AR; foreach($AR as $key => $AR_record){ $hash = array(); // 1行ずつ検査 $res = events_ck_ditail($AR_record); // 問題がなければDB登録 if($res !== false){ // DB登録処理 } } return; }

PHP Version 5.3.3
set_time_limit(60)と記述すれば60秒でタイムアウトしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/06 04:15

実際のコードを提示されたほうが良いかと。どのような処理をしているかも関係あるかもしれませんし。set_time_limit()を0以外の数値にした場合はどうなるのか、検証した結果も教えてください。あとPHPのバージョンですね。動作環境も追記してください。
aokyun

2018/08/06 04:45

業務で運用しているコードのため、そのまま載せることはできませんでしたが大まかな流れは追記した通りです。
guest

回答2

0

マニュアル読みましょう。

http://php.net/manual/ja/function.set-time-limit.php

イメージ説明

投稿2018/08/06 04:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aokyun

2018/08/06 04:31

回答ありがとうございます。 そちらの記述はデフォルト値の話であり、set_time_limitで定義した値が60なら実際のタイムアウトは60秒経過してからとなります。 念のため動作確認もしておりますので、確認済みです。
退会済みユーザー

退会済みユーザー

2018/08/06 04:40 編集

どこをどう読んだらそういう解釈になるんでしょう??? わざわざスクショ貼って、下線まで引いてあるというのに…
aokyun

2018/08/06 04:47

自分自身も最初はphpiniに値を定義した時点でそれが優先され、set_time_limitの値は使えないものと思っていましたが、どうやらそうではないようです。 google先生がいろいろと教えてくれましたが、実際コーディングしてみても、phpiniに設定されている値が30に対し、set_time_limitで設定した値が60のとき、タイムアウトは60秒で発生しました。
退会済みユーザー

退会済みユーザー

2018/08/06 04:49

質問に書かれている内容と、実際に疑問に思っていることに違いがありますね。
aokyun

2018/08/06 04:53

伝わりにくい文章で申し訳ないです・・・。 知りたいのはset_time_limit(0)と設定すればタイムアウトしないという認識だったのですが なぜ今回タイムアウトが発生してしまったのか、その原因の可能性を模索している最中です。 (fatal errorだったのでブラウザやwebサーバが原因とは考えにくいですが、自分が知らないだけかもしれません)
退会済みユーザー

退会済みユーザー

2018/08/06 04:57 編集

だから、その現象だと、マニュアルに書かれている通りの動作でしょ? それはむしろ正しい動作とかんがえるべきで、疑うべき動作は、 max_execution_time=30 、set_time_limit(60) で設定した時に、60 秒でタイムアウトが発生するというマニュアルに書かれた記述とは異なる動作をすることの方が問題ではありませんか?
aokyun

2018/08/06 04:57

ではなぜset_time_limit(60)と設定すると、タイムアウトが60秒で発生したのでしょうか? マニュアルの通り、phpiniを優先にするとしたら30秒でタイムアウトすると思うのですが。。
退会済みユーザー

退会済みユーザー

2018/08/06 04:59

バグレポートに起票されていないかどうかを確認してください。 もし、報告がない場合は、バグレポートを起票し、PHP開発チームに報告してください。
退会済みユーザー

退会済みユーザー

2018/08/06 05:09

どう思うかと聞かれても、あなたの実行環境は5.3 文献のほうは7.0 大きくバージョンが離れているものをなぜ参考にするのだろうと不思議に思います。
aokyun

2018/08/06 05:19

バージョンの違いは確かに気にしていましたが、同じ5.3でも似た話の記事がありました。 http://program.station.ez-net.jp/special/handbook/php5/system/timelimit.asp そのため、自分でコーディングして動かした結果も鑑みておそらく5と7で違いはないだろうと高を括っています。 (できればこれが否定・肯定される明確な理由を欲しているところでもあります) そもそも調べてもあまり情報が出なかったため、ここに質問した次第です。 ご協力いただきありがとうございました、当方でもう少し調べてみたいと思います。
退会済みユーザー

退会済みユーザー

2018/08/06 05:24

自分は実務的にPHP本体のバグとか、あれ?おかしいなと思っても、じゃあ、どうすればいいの?ってところまでしか興味ありません。 今回の場合なら、ini_set('max_execution_time', 0); を共通ファイルに書いて、「はいOK!」で済ませてしまいます。 気が向けば、バグレポートも出すけど。
rana_kualu

2019/05/13 15:02 編集

非常に今さらだが、このツリーは明白に間違いなので指摘しておく。 https://www.php.net/manual/ja/function.set-time-limit.php > デフォルトの制限値は 30 秒です。 なお、php.iniでmax_execution_timeの 値が定義されている場合にはそれを用います。 https://www.php.net/manual/en/function.set-time-limit.php > The default limit is 30 seconds or, if it exists, the max_execution_time value defined in the php.ini. php.iniのmax_execution_timeは『スクリプト実行時間のデフォルト値』にかかるものであり、『スクリプト実行時間』にかかるものではありません。 すなわち、 『php.iniのmax_execution_timeが30秒のとき、スクリプト開始から25秒経過後にset_time_limit(0)すると、実行時間は無制限になる』 『php.iniのmax_execution_timeが30秒のとき、スクリプト開始から25秒経過後にset_time_limit(60)すると、実行時間はそこから60秒になる』 という動作で合っています。 というか、わずか2行下に書いてあります。 マニュアル読みましょう。
guest

0

自己解決

処理ループの中に別スクリプトで動く処理が隠れていたようで、そちらにset_time_limitを記述したところ
タイムアウトすることなく処理が完了しました。
やはりmax_execution_timeで値が定義されていてもset_time_limit、またはini_setで定義を上書きできるようです。

ご協力いただきありがとうございました。

投稿2018/08/06 23:48

aokyun

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問