ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

色々試行錯誤していますが・・・うまく行きません・・・

どなたかお助けください!!

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>

このQ&Aに関連する最新のQ&A

A 回答 (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はバグが有ると悲惨なことになりますので十分ローカルでチェックした後に運用すること。自己責任で!
    • good
    • 0

時間の掛かる処理をサーバサイドで実行するには、いくつか方法があるでしょうが、



一件送信する毎に、

1件目送信しました。<br>

などをブラウザに送ってみてはいかがですか。

この回答への補足

それは具体的にはどうするのでしょうか・・・?

またレンタルサーバーなのでCRON等は使えません。

補足日時:2009/05/28 09:55
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHPで一定時間が経過すると処理が発生、は可能?

■質問1
・PHPで、一定時間が経過すると処理が発生みたいなことはできるでしょうか?

■質問2
・PHPで、指定時刻になったら処理が発生みたいなことはできるでしょうか?

Aベストアンサー

今はレンタルサーバでも「1分おき」にcronで起動させられるところが増えていると思います。

なので、現象発生→ファイル作成もしくはデータベース更新などでフラグを立てる→cronでフラグが立ってからの経過時間が一定時間を超えたら所定の処理をする。などといった感じがいいんじゃないでしょうか。

よほど「正確に10分」が必要でもない限りは、じっと遅延させる(実行を待ち合わせる)のは無意味です。10分以上で11分未満でよければcronで1分ごとにチェックする方がいいです。

Qphpのプログラムで一定間隔で処理をする方法

phpのプログラムで一定間隔で処理をする方法
phpのプログラムで5秒に1回しか処理しない方法はありますか?
同時に2人がアクセスしても、2人目のアクセスは5秒待ち状態になるようにしたいです。

ユーザー側からのアクセスで実行されるのが前提なので、
制限の掛ける方法で悩んでいます。

どうぞよろしくお願い致します。

Aベストアンサー

基本方針は回答1の通りでいいと思います。
最終実行時刻の記録は、「ファイルのタイムスタンプ」を使うのが簡単でしょう。
コードにすると、こんな感じ
---
<?php

lock_and_wait("flock.txt");

function lock_and_wait($filename)
{
$fp = fopen($filename, "ab+");
flock($fp, LOCK_EX);
$stat = fstat($fp);
$mtime = $stat[mtime];// タイムスタンプ=最終実行時刻取得
$next_execute_time = $mtime + 5; // 次回実行時刻を計算
$now = time(); // 現在時刻
$wait = $next_execute_time - $now;
if ($wait > 0) { // 現在時刻が次回実行時刻より前の場合
sleep($wait); // 次回実行時刻まで待つ
}
ftruncate($fp, 0); //タイムスタンプ=最終実行時刻を更新
fclose($fp);
}
?>
---

これで、
lock_and_wait("flock.txt");
の関数呼び出しが、
・1人目は、すぐに返ってくる
・2人目は、1人目の関数呼び出しより5秒経ってから返ってくる
という動作になります。

この場合、「1人目の処理を始めてから5秒待つ」って挙動なので、
「1人目の処理が終わってから5秒待つ」にしたい場合は、もう一工夫要ります。

基本方針は回答1の通りでいいと思います。
最終実行時刻の記録は、「ファイルのタイムスタンプ」を使うのが簡単でしょう。
コードにすると、こんな感じ
---
<?php

lock_and_wait("flock.txt");

function lock_and_wait($filename)
{
$fp = fopen($filename, "ab+");
flock($fp, LOCK_EX);
$stat = fstat($fp);
$mtime = $stat[mtime];// タイムスタンプ=最終実行時刻取得
$next_execute_time = $mtime + 5; // 次回実行時刻を計算
$now = time(...続きを読む

Qphpスクリプトのみで定期実行

PHPのプログラムのみで5分に1回くらいサーバーにアクセスしメールチェックしたい。
現状サーバーにアクセスしメールチェックするとこまで完成してるのですが、定期的にアクセスする方法で苦戦してます。
条件的には
(1)PCは切りたい
(2)cronは使用できません
(3)cgi等も使用できません

PHP無限ループ+タイマーで自動実行風にできるでしょうか?
詳しい方、ご回答よろしくおねがします。

Aベストアンサー

(1)PCは切りたい
(2)cronは使用できません

このどちらかが可能なら可能なんですが。。
専用サーバーとか自前のサーバーならPHPを好きなように実行できますが、
(というかそれならcronが使用できますよね。)
それ以外の場合はなんらかのアクセスがなきゃ実行されません。

>PHP無限ループ+タイマーで自動実行風にできるでしょうか?

無限ループでバッファ関数を使っても5分はきついでしょう。
それでもアクセスしなければ実行されないうえに、
大体のサーバーが30秒ぐらいでPHPの処理制限がありますから、それ以上実行できません。


一般的にこういった処理は普通cronを使います。

Qphpにcssを適応させたいのですが?

phpで出力させた結果をブラウズするのに、css指定させたいのですが?

できるのでしょうか?

Aベストアンサー

PHPだから特別な考えはしなくて良いです

PHPはあくまでも、サーバー側で動いて、その結果を出力させるだけです

つまり出力させたHTMLにごくごく普通にCSSを適用させれば良いだけです
又、テクニックとしCSSそのものをPHPで処理させることも可能ですよ

例えば
---------------index.html(又はindex.php)のhead内
<link rel="stylesheet" type="text/css" href="stylecss.php"/>
---------------

------------stylecss.php
BODY {
background-color: #<?php echo $background; ?>;
margin: 0px;
}

A:link {
color: #<?php echo $acollar; ?>;
text-decoration:none;
}
-----------
のようにしてしまって、CSSそのものを動的に生成することも可能です

PHPだから特別な考えはしなくて良いです

PHPはあくまでも、サーバー側で動いて、その結果を出力させるだけです

つまり出力させたHTMLにごくごく普通にCSSを適用させれば良いだけです
又、テクニックとしCSSそのものをPHPで処理させることも可能ですよ

例えば
---------------index.html(又はindex.php)のhead内
<link rel="stylesheet" type="text/css" href="stylecss.php"/>
---------------

------------stylecss.php
BODY {
background-color: #<?php echo $background; ?>;
margin: 0px;
...続きを読む

QPHPでメッセージボックス表示

お世話になります。
PHPでVBみたいな
メッセージボックス表示は
できるのでしょうか?
レンタルサーバのPHPMYADMIN
では、クエリ実行の確認時にでるのですが・・
できればボタンクリック時に別画面に遷移して
処理したくないので。
宜しくお願い致します。

Aベストアンサー

PHPはサーバサイドです。
サーバ上で動作しています。

メッセージボックスは、クライアント側の処理になります。

>レンタルサーバのPHPMYADMINでは、クエリ実行の確認時にでるのですが・・

単純にjavascriptで表示させているだけだとおもいます。
alertとかで。

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q外部ファイルにしたら文字化けしてしまいました

FC2ブログで下記【1】を

<script type="text/javascript">
<!--
【1】
// -->
</script>

で囲んで直接プラグインに書き込んだら
文字化けせずに表示されたのですが、

外部ファイルにして

<script type="text/javascript" src="【1】のJSファイルのパス"></script>

をプラグインに書き込んだら、
画像リンクはうまく表示されたのですが、
文字化けしてしまいました。

文字化けしない方法はないでしょうか?


【1】
// ランダムに画像を表示する
jmp = new Array();
img = new Array();
// ジャンプ先のアドレス(数字は画像と対応)
jmp[0] = "http://~";
jmp[1] = "http://~";
jmp[2] = "http://~";
jmp[3] = "http://~";
jmp[4] = "http://~";
// 画像のアドレス(数字はジャンプ先のアドレスと対応)
img[0] = "img/img1.jpg";
img[1] = "img/img2.jpg";
img[2] = "img/img3.jpg";
img[3] = "img/img4.jpg";
img[4] = "img/img5.jpg";
n = Math.floor(Math.random()*jmp.length);
document.write("<a href='"+jmp[n]+"' target='_blank'>");
document.write("<img src='"+img[n]+"' border='0'>");
document.write("</a>");

FC2ブログで下記【1】を

<script type="text/javascript">
<!--
【1】
// -->
</script>

で囲んで直接プラグインに書き込んだら
文字化けせずに表示されたのですが、

外部ファイルにして

<script type="text/javascript" src="【1】のJSファイルのパス"></script>

をプラグインに書き込んだら、
画像リンクはうまく表示されたのですが、
文字化けしてしまいました。

文字化けしない方法はないでしょうか?


【1】
// ランダムに画像を表示する
jmp = new Array();
img = new Array();
// ジャンプ先...続きを読む

Aベストアンサー

自分は5歳児だろうが主婦だろうが手は抜きません。


とりあえず試しに、

<script type="text/javascript" src="JSファイルへのパス" charset="Shift-JIS"></script>

~と言う風にしてみて下さい( charset="Shift-JIS" というのを付け足す)。それで文字化けが直るようなら、貴方のJSファイルの文字コードは「Shift-JIS」と言う事になります。FC2のBlogサービスですか?それでHPやBlogを作っているのなら、基本的には文字コードはサーバ側、つまりこの場合は「EUC-JP」に統一するべき~という事になります。

一般的に、Windowsの標準の環境だと。前段で述べた様な、様々な種類の文字コードを扱う事が出来ないので。事実上、作業は「Shift-JIS」1択と言う事になります。また『メモ帳(notepad.exe)』では「改行コード」を編集出来ないので、HTMLやJavaScript(JSファイル)を編集するには力不足です。何か特別なソフトとかを使わずに、Windows標準の『メモ帳(notepad.exe)』でJSファイルを編集したのであれば、十中八九、文字コードは「Shift-JIS」になっているはずです。


>文字コード
「文字コード」とは、コンピュータ上でテキストファイル(*.txt)をやり取りする時の方式の事で、現在では100種類近くの文字コードがあります。インターネット上でよく使われる文字コードは、「UTF-8」、「Shift-JIS」、「EUC-JP」~の3種類で、基本的にはこれだけ押さえておけばOKです。

考え方としては、日本語や英語のように。同じ意味を持つ文書でも色んな国の言葉で書く事が出来る様に。コンピュータ上での文書の表し方にも方言というか、色んな国の言葉がある様な物だと思ってて下さい。先に述べた「改行コード」や「BOM無し」とかは忘れて下さい。

で、初心者はコレだけ覚えて置いて欲しいのですが…

・半角英数文字だけなら文字化けは起きない

~と(実際は違いますが、話がややこしくなるので簡単にします)。半角英数文字ってのは「abc,?!#123456+-=」みたいな文字の事です。全角文字とは違うので注意して下さい(全角文字 → abc,?!#123456+-=)。従って逆説的に言えば「日本語を使う時は常に文字コードの影響を受ける」と言う事です。

自分は5歳児だろうが主婦だろうが手は抜きません。


とりあえず試しに、

<script type="text/javascript" src="JSファイルへのパス" charset="Shift-JIS"></script>

~と言う風にしてみて下さい( charset="Shift-JIS" というのを付け足す)。それで文字化けが直るようなら、貴方のJSファイルの文字コードは「Shift-JIS」と言う事になります。FC2のBlogサービスですか?それでHPやBlogを作っているのなら、基本的には文字コードはサーバ側、つまりこの場合は「EUC-JP」に統一するべき~という事になります。

...続きを読む

QPHP ボタンが押されたら処理を実行する

PHPプログラミングをしています。
「はい」というボタンが押されたらこの処理を行い、
「いいえ」というボタンが押されたらこの処理を行う
ということはどうすれば実装できるのでしょうか?

Aベストアンサー

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="0">
<input type="submit" value="いいえ">
</form>


送信先
$answer = $_POST["answer"];

if($answer == 1){
// 「はい」の時の処理
}else{
// 「いいえ」の時の処理
}


ちなみに、自分から自分へPOSTすればPHPスクリプトも2つに分けずにできると思います。
また、POSTじゃなくGETでも同様のことはできると思います。

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" ...続きを読む

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?


人気Q&Aランキング