- ベストアンサー
一定時間毎に同じ動作を繰り返し行うには・・・
色々試行錯誤していますが・・・うまく行きません・・・ どなたかお助けください!! PHP4.xx SQLite3.xxです。 初心者です。 DBに登録されているメールアドレスリストに10秒ごとにメールを送信するプログラムです。 メールリストは300人くらいですが、一気に送るのはサーバー的に負荷がかかると考え一人目にメールを送り、10秒経ったら次の人・・・また10秒経ったら次の人・・・に送信という形にしたいです。 最初はPHPのファイルでFORで回して処理の最後にsleep(10)で遅延させたらいけると(浅はかにも)思ってやってみましたが、ブラウザの表示でtimeoutするようでダメでした。 そこで今はjava scriptでリフレッシュさせてリフレッシュ先のURLの最後にfilename.php?id=●の数字の部分を順番に+1して行って終わったら処理終わるという手法を考えましたが・・・それがうまく行きません。 1人目の処理はうまく行ってメールも送信されますが次の人へ送信するURLへのリフレッシュがうまく行きません。 考え方がおかしいのでしょうか? それとも発想はいいけど、単にコードの問題なのでしょうか・・・? ちなみに処理する毎に毎回「●●さんにメールを送信しました」と表示されるようにしたいのです。(つまりbodyでリフレッシュかけると何も表示されずに次の処理に行くので見てる方は実際に送られているかどうか心配。わざわざ毎回にみんなに電話して「メール来た?」といか確認してられないですし・・・) 実際に作ってみたコードはこのような感じです。 -------------(ここから)---------------------------------- <? ■■ここにメール送信のコードがあります。これは実際に届いているのでOKです。 if (!$mail->send()){ echo("メールが送信できませんでした。エラー:".$mail->getErrorMessage()); } else { $message = "会員No:".$id." <b>".mb_convert_encoding($row["name"], "SJIS", "EUC-JP")."</b>様にメール配信しました。"; ■■↑毎回処理する毎に会員NOと名前+「送信しました」メッセージが表示されるようします。 sleep(5); $id++; //次の人に行くためにidを追加します。 } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ■■リフレッシュのjs部分 $idはDBから取得してます。GETがでid指定がない時は「1」が入るようになっていてそこからスタートします。 <SCRIPT language="JavaScript"> <!-- function refresh() { location.href = "haishin_send01.php?id=<?=$id?>"; setTimeout('refresh()', 5000); //5秒にリフレッシュする予定 } // --> </SCRIPT> <title>メルマガ配信テスト</title> <p> <?=$message?> </p> ■■ここで処理が終わって次のURLへリフレッシュする <SCRIPT language="JavaScript"> <!-- refresh(); // --> </SCRIPT> </body> </html>
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
案1.タイムアウト延長 300人×10秒=3000秒 とのことなのでサーバー(apache)のタイムアウトが先に引っかかるかもしれませんが、 set_time_limit(3000);//実際は余裕を持った時間に でまずはPHPのタイムアウトを防止します。 ブラウザのタイムアウトは、定期的にデータを送って回避します。 例は、下記 http://kikky.net/pc/php_timeout.html 案2.バックグラウンド実行 サーバーにcli版のphpが入っている前提ですが (注 絶対にレンタルサーバーでデバッグはしないこと) system("/usr/local/bin/php sendml.php > /dev/null &"); バックグラウンド実行用のスクリプト sendml.php とそれを実行させるスクリプトで構成します。 進行状況を知りたい場合は、ファイルに定期的に進捗を吐き出して それを読むスクリプトが必要です。 案2はバグが有ると悲惨なことになりますので十分ローカルでチェックした後に運用すること。自己責任で!
その他の回答 (1)
- Yanch
- ベストアンサー率50% (114/225)
時間の掛かる処理をサーバサイドで実行するには、いくつか方法があるでしょうが、 一件送信する毎に、 1件目送信しました。<br> などをブラウザに送ってみてはいかがですか。
補足
それは具体的にはどうするのでしょうか・・・? またレンタルサーバーなのでCRON等は使えません。