0

メールの送信を処理するスクリプトがあります。送信する電子メールは数千に及ぶ可能性があります。「あなたのメッセージが送信されています。」という行に沿って何かを言うページをユーザーに表示したいのですが、ユーザーにメッセージを送信させたくないので、そのページに実際のメッセージの送信を行わせたくありません。スクリプトが終了するまで空白のページが表示されます。また、ユーザーがスクリプトの終了を待つ必要はありません。

IDのリストを別のPHPページ(run.phpと呼びます)に渡し、ユーザーが実際にアクセスすることなく実行できるようにしたいと思います。そのため、IDをページに渡して実行を開始しますが、現在のページの読み込みを終了して、「メッセージが送信されています」というメッセージが表示されます。

<?php
/* SESSION DATA HERE */
executeMailSend($ids);
?>
<html>
<head>
....
</head>
<body>
Your messages are being sent.
</body>
</html>

私はajaxを使ってこのようなことをすることができると思いますが、これをクライアント側のコーディングに依存させたくありません。

また、可能であれば、スクリプトをバックグラウンドで実行して、スクリプトを開始するセッションのセッションデータを保持する必要があります。このデータを個別の変数として渡す必要はありません。

また、exec()やsystem()のようなものは使いたくありません。

何か案は?

4

6 に答える 6

1

詳細については、AJAXのパワーを活用してください。w3schools.comによるこのチュートリアルをチェックしてください。

http://www.w3schools.com/ajax/default.asp

于 2012-12-14T03:36:37.437 に答える
1

cron ジョブは 1 つのオプションです。データベースにキューを実装することでそれを行うことができます。送信するメールのエントリを追加するだけで、cron ジョブがそれらのエントリを処理します。しかし、その道を進む前にこれを読んでください: http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-あなた/

cron ジョブを使用する場合、どこかにキューを実装することになります (フラット ファイル...blech、MySQL、他の DB など)。

実際にキューイング用に作られたものを使用してみませんか? たとえば、Amazon (http://aws.amazon.com/sqs/) を使用できます。しかし、使用するソフトウェア/プロバイダーが何であれ、これは適切なジョブ キューイングが最適であるように思えます。いくつかの作業項目をキューに追加するページにユーザーを移動させたいとします (この場合は、電子メール アドレスと、何をしているかに応じてメッセージになる可能性があります)。次に、キュー ソフトウェアには、これらのジョブを処理する何らかの手段が必要です (つまり、実際に電子メールを送信します)。

変数を渡したくないと言いますが、各ジョブに必要なデータをキューに送信する必要がある可能性があります。ロックとパフォーマンスだけを考えて、余分なデータをデータベースに保存する可能性があります。

于 2012-12-14T03:46:03.863 に答える
0

以前に使用したスクリプトである現在のオプションに固執する必要があると思います。より良いオプションを見つけたいと思っていましたが、使用するコードは次のとおりです。

function backgroundPost($url){
    $parts=parse_url($url);
    $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30);

    if (!$fp) {
        return false;
    } else {
        $out = "POST ".$parts['path']." HTTP/1.1\r\n";
        $out.= "Host: ".$parts['host']."\r\n";
        $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out.= "Content-Length: ".strlen($parts['query'])."\r\n";
        $out.= "Connection: Close\r\n\r\n";
        if (isset($parts['query'])) $out.= $parts['query'];

        fwrite($fp, $out);
        fclose($fp);
        return true;
    }
}

backgroundPost($siteURL.'/run.php?ids='.urlencode($ids).'&sessiondata='.urlencode($sessiondata));

これを使用することに問題がある人はいますか?セキュリティ、悪いコードなど?

于 2012-12-14T03:57:57.780 に答える
0

スクリプトでそのメールを「メール クエリ」に追加し、cron ジョブをスケジュールしてメールを送信することができます。PHPスクリプトを非同期で呼び出す方法は他にないと思います。

多分これはあなたを正しい方向に向けるかもしれません: http://blog.markturansky.com/archives/205

于 2012-12-14T03:39:06.670 に答える
0

Linux ボックスにアクセスできる場合。Cronjobs と呼ばれるものを使用できます。

参照用に使用する独自のデータベース テーブルを使用して、別のスクリプトを作成できます。

設定された間隔で、PHP 用の Linux CLI を介して PHP を実行し、スクリプトを実行します。ユーザーがページにいる必要はありません。ただし、データベースを適切に構成する必要があります。

唯一の問題は cronjobs にあり、すべての出力は管理者の電子メール (/etc/aliases

Cronjob 入力の例:

nano /etc/crontab

* * * * *  root /usr/bin/php /var/www/cron.php 

cron.php には、この場合、特定の関数用のスクリプトが設定されています。電子メール ユーザー。

http://www.thegeekstuff.com/2011/07/php-cron-job/

于 2012-12-14T03:39:07.603 に答える
0

Linux サーバーを使用していますか? スクリプトを (PHP 内で) fork() してから、子プロセスをデーモン化し、デタッチして、初期化中の HTTP リクエストが終了した後も引き続き実行できるようにします。子プロセスを正しく強制終了するようにしてください。

http://www.re-cycledair.com/php-dark-arts-daemonizing-a-process

于 2012-12-14T05:11:52.407 に答える