admin【PHP】タイムアウト(set_time_limit)を設定しているのにタイムアウトされない現象を調べてみたツイートシェアはてブGoogle+PocketAPIを実行してからAPIレスポンスが返却されるまで時間がかかることが何度かあります。通常であれば1〜3秒で返してくれるのですが、遅い時は60秒とかかかることがあります。そこで「set_time_limit()」を使ってタイムアウトの値を変更しようと思ったらどつぼにはまりました。max_execution_timeの設定を無制限に変更したいmax_execution_timeの値は、set_time_limit()関数使うことでPHPのプログラム側で書き換えることができます。やりたかったことは、「API接続中にタイムアウトを回避したいので、タイムアウトを無制限に設定したい」というものです。ローカル環境でとりあえず試してみるとりあえず、ローカル環境でテストです。max_execution_timeはデフォルトだと30秒が設定されています。処理を長くさせれば30秒過ぎたときにタイムアウトエラーとなるはずです。真っ先に思うロジックがsleepを使ったやり方です。Sleepがダメかと思ってfile_get_contents()やcurlを使ってダミーAPIで遅延を発生させてもタイムアウトしませんでした。理由はsleep()やfile_get_contents()などの関数はタイムアウト時間に含めない仕様さっさと公式サイトの注釈を読めば早かったです。公式サイトに下記のように書かれています。‘max_execution_time’、...)の両方。スリープ、file_get_contents、shell_exec、mysql_queryなどの時間コストは考慮しないので、このメソッドmy_background_exec()をビルドして、バックグラウンド/分離プロセスで静的メソッド/関数を実行し、タイムアウトにするとタイムアウトになります。sleep(1)やfile_get_contents($url)などを使って処理を遅くしても、タイムアウト時間としてカウントしてくれていないということです。プログラムの遅延を起こすには、複雑な演算をするとかしないとタイムアウトを発生させることができません。言って無限ループで・・・という発想もおかしいですが、結構難しいですね。WIndows環境はちゃんとカウントされるちなみに、Windows環境でプログラムを動作させている(例えばXammp)場合は、sleep(1)やfile_get_contents($url)などの停止時間もカウントされるようです。MacだったりLinux環境だと、カウントされませんので注意が必要です。最後に原因がわかるまで4時間ほどかかりました。ネット上には普通にset_time_limit()でタイムアウトする書き込みがありますが、MacやLinux環境の場合はネットの情報はあてにならなかったです。困ったら、公式サイトを翻訳してちゃんと読んだ方が良いですね。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。'\''.」エラーRECOMMENDこちらの記事も人気です。