0

ユーザー間のメッセージング機能を備えた Web サイトがあります。ユーザーがログインjQuery.ajax()すると、PHP スクリプトを呼び出して新しいメッセージをチェックします。リクエストを削減するために、私の PHP スクリプトはcheck_new_messages()関数の呼び出しをループし、新しいメッセージがない場合sleep(5)はループ内で呼び出し、5 秒待ってからループを続行します。を使用してスクリプトの実行時間を確認し、microtime()60 秒を超えた場合は 0 を返します。ajax はこの値を受け取り、スクリプトを再度呼び出します。

function check_message_queue($user) {
    $response = 0;
    $msgs = 0;
    $time_start = microtime(true);

    while (!$msgs = check_new_messages($user)) {
        sleep(5);
        $time_end = microtime(true);
        if ($time_end - $time_start >= 60)
            return $response;
    }

    // has new messages
    sleep(5);
    return $response;
}

私のphp.iniはmax_execution_time120に設定されています。

最初はすべて問題なく動作しますが、ページを更新すると約 10 秒の遅延が発生し、「最大実行時間が 30 秒を超えました」という PHP エラーが表示され、続いて Apache がクラッシュすることがあります。PHP の max_execution_time は間違いなく 120 秒に設定されているため、何が起こっているのかわかりません。

私はこれまでにこのようなことをしたことがないので、うまくいけば、私の側のコーディングが悪いだけです。

ここに私のJavaScriptがあります:

var request_new_messages = function() {
    $.ajax({
        url: 'messages/checkqueue',
        type: 'post',
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',
        data: { id: 0 },
        complete: function() { request_new_messages(); },
        error: function(jqXHR, textStatus, errorThrown) { handle_error(); },
        success:
            function(data, textStatus, jqXHR) {
                if (textStatus == "success") {
                    if (!isNaN(data)) {
                        var response = parseInt(data);
                        if (response > 0)
                            alert('You have ' + response + ' new messages.');
                    }
                }
            }
    });
};
4

2 に答える 2

0

そのためにPHPを実際に使用するべきではありません。サーバーにアクセスできる場合、つまり共有ホスティングなどではない場合は、nodejs と socket.io について読んでください。それに加えて、誰かがアクセスするたびにphpを一時停止しているということです。スクリプトには、1 秒間に数回アクセスできます。50 人のユーザーがいるとどうなるか想像してみてください。これにより、apache がクラッシュする可能性があります。apache のログを確認して、ここで最後の数行を報告してください (つまり、クラッシュ前)。

于 2013-08-20T07:08:12.083 に答える