- 締切済み
スクリプト中の特定の処理部分における時間制限のかけ方
初めて質問させていただきますheepoo9と申します。 PHP歴は1年ちょっとです。 (1)PHP実行WEBサーバ(サブSMTPサーバ(Xmail)も兼ねる) (2)メール送信用SMTPサーバ(Postfix、25番ポート使用) の二台を使ってメール送信をしたいのですが、その際にクリアできない問題に当たっています。 (1)上のPHPスクリプトをブラウザを通して起動させ、(2)のSMTPサーバを使ってmb_mail_send()でメールを送るとします。 現在(1)のphp.iniではSMTPのデフォルトがlocalhostに設定されているためにini_set(SMTP,"(2)サーバIP")という形で一時的にSMTPを(2)に切り替えて送信しています。 その際に(2)サーバが何らかの理由で使用不能ならばデフォルト通り(1)(localhost)でメール送信をしたいとします。 この時の処理として、 --------------------------------- //SMTP設定を(2)に変更 ini_set(SMTP,"(2)サーバIP"); $mail_res = mb_mail_send(各引数); if(!$mail_res){ ////SMTP設定をデフォルトに変更 ini_restore(SMTP); mb_mail_send(各引数) or die; } --------------------------------- のような処理を行っているのですが、これで対応できないケースについてどうしたら良いのか分からず困っています。 具体的な(2)サーバの状況として、 ・電源が落ちている ・完全にOSが落ちている ・LANケーブルが切れている などの場合には上記の処理で問題ないのですが、 ・ソケットで25番ポートへの接続は正常() ・Postfixに何らかの問題がある の場合に、mb_mail_send()部分でのレスポンスが得られず、タイムアウトとなってしまいます。 対策として、このレスポンスを得るまでの時間に時間制限を設けて、 ・5秒以上応答無しならば、デフォルトSMTP設定に戻して(1)サーバから送信する などの処理を行おうと思うのですが、PHPスクリプトの特定の部分に制限時間を設ける方法を全く探し出せずにいます。 非常に困り果てています。 どなたか解決方法がおわかりになる方はいらっしゃいますでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
ああ・・失礼しました。ポート25は正常なんですね >・Postfixに何らかの問題がある をどう判断するかですかねぇ・・・ HELOを送って戻り値をチェックするとか? それも通っちゃいます? if($fp){ fputs($fp,"HELO $server\r\n"); $result = fgets($fp,128); fclose ($fp); $resultの書式を検証してみる・・・ }
- yambejp
- ベストアンサー率51% (3827/7415)
ソケットでチェックしてみるとか・・・ <? $server="・・・"; $fp = @fsockopen($server,25, $errno, $errstr,5); if($fp){ fclose ($fp); 成功した処理; }else{ 失敗した処理; } ?>
補足
早速の回答ありがとうございます! 一応これも試してみたのですが、ここは成功してしまうケースなのです。 …なのでどこにどのようにしてタイムアウトを設けたら良いのか分からないんです…。
補足
$result = fgets($fp,128)の行で、なんの反応もなくなってPHP側のタイムアウトになってしまいます。 エラー文は、 Fatal error: Maximum execution time of 30 seconds exceeded ~ ちなみにmail()では同じくタイムアウトするのですが、30秒以上反応がなく、(2)サーバー側のタイムアウトになります。 ちなみにエラー文は、 CGI Timeout The specified CGI application exceeded the allowed time for processing. The server has deleted the process. になります。