0

私は周りを検索しましたが、共有ホスティングのほとんどで機能しない set_time_limit(0) 以外の解決策を見つけることができませんでした。

基本的に、ユーザーの友達が必要なときにメッセージを送信するスクリプトがあります。一部のユーザーには 4000 人以上の友達がいて、スクリプトに問題が発生しています。

現在、AJAX を使用してバックグラウンドでこのスクリプトを呼び出しています。この終了までユーザーを待つ必要がない/したくないので、何らかのバックグラウンド処理が必要です。

私の現在のコード:

global $client, $emails, $subject, $message;
_info("got on_auth_success cb, jid ".$client->full_jid->to_string());
$client->set_status("available!", "dnd", 10);

set_time_limit(60*10);

if( count($emails) < 40 ){

    foreach( $emails as $email )
    {
        $msg = new XMPPMsg(array('to'=>'-'.$email.'@chat.facebook.com'), $message);
        $client->send($msg);  
        sleep(1);
    }

}
else
{
    $counter = 0;
    //Lets create batches
    foreach( $emails as $email )
    {
        $counter++;
        $msg = new XMPPMsg(array('to'=>'-'.$email.'@chat.facebook.com'), $message);
        $client->send($msg);
        sleep(1);

        if( $counter == 50 )
        {
            sleep(10);
            $counter = 0;
        }
    }
}
$client->send_end_stream();

exec を使用する良い解決策でしょうか? たとえば

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

これは任意のホストにインストールできる wordpress プラグインであるため、ほとんどのホスティングで機能するソリューションが必要です。ありがとう!

4

1 に答える 1

0

これをある種のcronに入れると理想的です。送信する電子メールのリストを作成してキューに保存し、そのキューにある種のプロセスの cron スクリプトを用意します。Wordpress には独自の cron メカニズム ( wp_cronを参照) がありますが、トラフィックの少ないサイトでは、その数のメールを送信するのに十分な頻度で実行するのは難しい場合があります。確かに、適切な cron を使用して wp_cron が実行されていることを確認できます。How to execute a large PHP Script?が表示されるはずです。とても関係があるので。

本当に同期させたい場合は、バックグラウンド ajax を使用しているため、いくつかの小さな ajax 呼び出しを行うこともできます。たとえば、ajax スクリプトで一度に 20 通のメールを実行し、残りのメール数を返すことができます。次に、ブラウザー上のクライアント コードは、まだいくつか残っていることを認識し、おそらく現在の位置を示すカウンターを使用して、ajax を介してバックグラウンド php を再度呼び出します。[編集: しかしこれは、ユーザーが送信を完了するためにブラウザを開いたままにするのに十分な忍耐力に依存しており、インターネットへの比較的安定した接続が必要になる場合があります。]

于 2013-07-13T17:27:04.100 に答える