
色々試行錯誤していますが・・・うまく行きません・・・
どなたかお助けください!!
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-transitio …
<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>
No.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はバグが有ると悲惨なことになりますので十分ローカルでチェックした後に運用すること。自己責任で!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
空メール送信~メールアドレス取得
-
存在しないメールアドレスかど...
-
HPの更新をしたら自動でメール...
-
コマンドプロンプトで添付ファ...
-
拡張子PHP3のスクリプトを...
-
phpのheader("Location:#pos")...
-
PHPのif文でその処理を途中で抜...
-
.phpと.incファイルの違いはな...
-
*.php、*.php3、*.phtmlの違い
-
Prompt入力値をphp変数として取...
-
フォームで戻った際に入力済み...
-
ZendFrameworlkでZend_Session...
-
リンク先を隠す方法はないでし...
-
ImageCreate関数が undefined f...
-
phpのコードがそのまま文字列と...
-
CFileDialogの最初のディレクト...
-
class.upload.phpの戻り値(返...
-
require_onceが動いていない
-
phpでzipファイルダウンロード...
-
透過PNGが透過されない!!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループの中で mailItemObj.Disp...
-
submitボタンの二重送信について
-
VB.NETでフリーメールアドレス...
-
タイマー機能を使って指定時間...
-
SendMailがエラーを返さない
-
VB6にてメールを送信する方法
-
SMTPサーバの指定なしでメ...
-
【エクセルVBA】メール送信前に...
-
コマンドプロンプトで添付ファ...
-
UWSCにつきまして
-
PHPでメール送信する際の送信数...
-
存在しないメールアドレスかど...
-
問い合わせ完了ページでの二重...
-
VBでメールを送る時のSMT...
-
メール送信 MAPIMessages.Send ...
-
phpでアドレス形式をチェックす...
-
mb_send_mailで複数宛てにtoで送信
-
SMTPメール送信で送信者名と送...
-
phpメールフォームから送信され...
-
Windowsサーバーでメール送信プ...
おすすめ情報