タイムアウト:長いプログラムで画面が真っ白、あるいは「表示できません」。さて、これは何が関係している? ・・・ 【サーバー管理】
2009-01-23
単純な データベースからのクエリ処理ではなく管理的なシステムを廻し、
(それが、極端に時間がかかるものだった場合・・・)
・画面が真っ白になったり
・「この頁は表示できません」 ・・・ などとなる
決して「エラー」というわけではないのだが・・・
少し、このあたり探ったので
メモとしておこう
◎タイムアウトについて、ちと考える
追記に ▼
**************************************************
タイムアウトについて、ちと考える
**************************************************
■考えられる、要因可能性
/*------------------------------------------*/
□ローカル
・ブラウザ自体の設定
・ブラウザには、タイムアウトにおける
対応時間を設定できる「レジストリ項目」が存在する
※これは随分前から知っていて、今回は
すでに対応しているPCでの出来事だった。
※すでにご存知の方もいらっしゃると思うが、ここにも
記しておこう・・・
●ブラウザのタイムアウトの時間の調整
ただ、今回困ったのはこの状況でも
・あるサイトでは問題なく
・あるサイトでは(同じプログラム、上記設定でも)
タイムアウトして、プログラムが最後まで確実に完了 しないのだ。
□サーバー
・サーバー側でチェックすべきは
・Apacheの設定
・phpプログラムの設定
(今回この作業のきっかけになったのは
PHPプログラムだ)
・MySQLの設定
だ。
●php.ini
phpの初期設定ファイルである、php.ini
サーバーの構造やバージョンにより置き場所はいろいろ
あるようだ。
私が知っているのでも
・/usr/local/lib/php.ini
・/etc/php.ihi
phpinfo() とかで、確認できる
※今回に関係しそうな項目は、
※今回の目的「タイムアウト」を無いようにするためには
これは、「Off」の方がいいのではないか?
・バッファリングしていると、
phpの動作が完了するまで何も「ブラウザに返らない」
したがって、「応答なし」となるのではないか?
>> 現在 On だったので、Off にして再起動
すればどうか?
※他に関係しそうな項目は、
●httpd.conf(Apache)
まさに「Timeout」という設定項目がある
場所は
・/etc/httpd/conf/htpd.conf とか
※今回に関係しそうな項目は、
※昔は、このデフォルトは 1200 ぐらいだったらしい
>> ここを少し多めに、600 にして再起動
すればどうか?
※他に関係しそうな項目は、
これらの情報を基に、これから格闘を始める。
詳細報告はまた・・・
タイムアウトについて、ちと考える
**************************************************
■考えられる、要因可能性
/*------------------------------------------*/
□ローカル
・ブラウザ自体の設定
・ブラウザには、タイムアウトにおける
対応時間を設定できる「レジストリ項目」が存在する
※これは随分前から知っていて、今回は
すでに対応しているPCでの出来事だった。
※すでにご存知の方もいらっしゃると思うが、ここにも
記しておこう・・・
●ブラウザのタイムアウトの時間の調整
***********************************************************
1.<スタート>メニュー→<ファイル名を指定して実行>と選択。
2.「名前」に半角で「regedit」と入力し、<OK>ボタンをクリック。
3.「レジストリエディタ」が起動したら、
HKEY_CURRENT_USER→Software→Microsoft→Windows→CurrentVersion→Internet Settings
とキーをたどって開く。
4.<編集>メニュー→<新規>→<DWORD値>と選択し、
名前を「KeepAliveTimeout」とする。
5.「KeepAliveTimeout」をダブルクリックで開き、
<10進数>をチェックする。
6.「値のデータ」を「300000」に書き換えて<OK>ボタンをクリック。
7.<×>ボタンを押して、レジストリエディタを終了する。
8.後はWindows XPに再ログオンして設定完了。
これでKeepAliveのタイムアウト値が5分に
***********************************************************
ただ、今回困ったのはこの状況でも
・あるサイトでは問題なく
・あるサイトでは(同じプログラム、上記設定でも)
タイムアウトして、プログラムが最後まで確実に完了 しないのだ。
□サーバー
・サーバー側でチェックすべきは
・Apacheの設定
・phpプログラムの設定
(今回この作業のきっかけになったのは
PHPプログラムだ)
・MySQLの設定
だ。
●php.ini
phpの初期設定ファイルである、php.ini
サーバーの構造やバージョンにより置き場所はいろいろ
あるようだ。
私が知っているのでも
・/usr/local/lib/php.ini
・/etc/php.ihi
phpinfo() とかで、確認できる
※今回に関係しそうな項目は、
【output_buffering】
・出力バファリングの設定を行う(OnまたはOff)
・出力を直接だすのではなく、いったん貯めて
必要になった時点で出力する などが可能に
・On:HTTP BODYを出力した後でもHTTPヘッダが出力可能
・バファサイズの制限を設定するには直接数字
(例:)output_buffering = 4096
■関連
[ob_start] 出力のバッファリングを有効にする
[header] 生の HTTP ヘッダを送信する
・出力バファリングの設定を行う(OnまたはOff)
・出力を直接だすのではなく、いったん貯めて
必要になった時点で出力する などが可能に
・On:HTTP BODYを出力した後でもHTTPヘッダが出力可能
・バファサイズの制限を設定するには直接数字
(例:)output_buffering = 4096
■関連
[ob_start] 出力のバッファリングを有効にする
[header] 生の HTTP ヘッダを送信する
※今回の目的「タイムアウト」を無いようにするためには
これは、「Off」の方がいいのではないか?
・バッファリングしていると、
phpの動作が完了するまで何も「ブラウザに返らない」
したがって、「応答なし」となるのではないか?
>> 現在 On だったので、Off にして再起動
すればどうか?
※他に関係しそうな項目は、
【max_execution_time】
・スクリプトがパーサにより強制終了されるまでに
許容される最大の 時間を秒単位で指定
・デフォルトでは、30 に設定
( コマンドライン から実行する場合のデフォルト設定は 0 )
【max_input_time】
・スクリプトが POST、GET そしてファイルアップロードなどの
入力を パースする最大の時間を、秒単位で指定
【memory_limit】
・スクリプトが確保できる最大メモリをバイト数で指定
(使用可能メモリに制限を設けたくない場合は、 -1 を指定)
必要になった時点で出力する などが可能に
・On:HTTP BODYを出力した後でもHTTPヘッダが出力可能
・バファサイズの制限を設定するには直接数字
(例:)output_buffering = 4096
■関連
[set_time_limit] 実行時間の最大値を制限
※デフォルトの制限値は 30 秒
この関数がコールされた場合、
タイムアウトカウンタをゼロから再スタート
(つまりその合計値が スクリプトの実行される時間)
[ini_set] 設定オプションの値を設定
・スクリプトがパーサにより強制終了されるまでに
許容される最大の 時間を秒単位で指定
・デフォルトでは、30 に設定
( コマンドライン から実行する場合のデフォルト設定は 0 )
【max_input_time】
・スクリプトが POST、GET そしてファイルアップロードなどの
入力を パースする最大の時間を、秒単位で指定
【memory_limit】
・スクリプトが確保できる最大メモリをバイト数で指定
(使用可能メモリに制限を設けたくない場合は、 -1 を指定)
必要になった時点で出力する などが可能に
・On:HTTP BODYを出力した後でもHTTPヘッダが出力可能
・バファサイズの制限を設定するには直接数字
(例:)output_buffering = 4096
■関連
[set_time_limit] 実行時間の最大値を制限
※デフォルトの制限値は 30 秒
この関数がコールされた場合、
タイムアウトカウンタをゼロから再スタート
(つまりその合計値が スクリプトの実行される時間)
[ini_set] 設定オプションの値を設定
●httpd.conf(Apache)
まさに「Timeout」という設定項目がある
場所は
・/etc/httpd/conf/htpd.conf とか
※今回に関係しそうな項目は、
※昔は、このデフォルトは 1200 ぐらいだったらしい
>> ここを少し多めに、600 にして再起動
すればどうか?
※他に関係しそうな項目は、
【KeepAlive】
・HTTP の持続的な接続を有効にする
・デフォルト: KeepAlive On
■関連
[KeepAliveTimeout] 持続的な接続で
次のリクエストが来るまでサーバが待つ時間
※デフォルトの制限値は 30 秒
この関数がコールされた場合、
タイムアウトカウンタをゼロから再スタート
(つまりその合計値が スクリプトの実行される時間)
・HTTP の持続的な接続を有効にする
・デフォルト: KeepAlive On
■関連
[KeepAliveTimeout] 持続的な接続で
次のリクエストが来るまでサーバが待つ時間
※デフォルトの制限値は 30 秒
この関数がコールされた場合、
タイムアウトカウンタをゼロから再スタート
(つまりその合計値が スクリプトの実行される時間)
これらの情報を基に、これから格闘を始める。
詳細報告はまた・・・