2

私はこの次のコードを持っています:

$(window).load(function()
{
    $('#content1').load('database.php');
    setInterval (function() 
    { 
        $.post('status.php', { id: '1'}, function(responseText, responseStatus)
        { 
            $('#content2').html(responseText); 
        });  
    }, 5000);
});

基本的に、私はdatabase.phpを呼び出してデータベースの挿入を行い、定期的な間隔を使用して進行状況のステータスを取得しています。問題は、挿入中に、インターバルポストがリクエストタイムアウトエラーを表示することです。database.phpの処理が完了すると、content2のテキストが書き込まれます。

今のところ、status.phpファイルで非常に単純なコードを使用しており、database.phpの処理中に応答を取得できるかどうかを確認しています。コードは次のとおりです(非常に単純です)。

<?php
    echo "hello";
?>

タイムアウトエラーが発生し、応答がない理由がわかりません。ご覧のとおり、statuse.phpファイルでは、呼び出しをブロックする可能性のあるphpセッション変数を使用していません。面白いことに、データベースの処理が完了すると、応答が返されます。つまり、「hello」というテキストが表示されます。

4

2 に答える 2

2

おそらくセッションを使用しています。PHPのデフォルトのファイルベースのセッションハンドラー、スクリプトがアクティブな間、セッションをロックします。そのため、呼び出された瞬間から、session_start()同じセッションを使用する他のスクリプトを並行して実行することはできません。他のスクリプトは、session_start()呼び出しでブロックしてハングします。最初のスクリプトが終了するまで。

「進行状況」チェック呼び出しを成功させる場合はsession_write_close()、データベーススクリプトでを実行して、セッションロックを解除し、そのセッションの他の要求を続行できるようにする必要があります。

于 2013-01-05T19:59:31.773 に答える
1

問題は、私のサービスが1つのdynoしか使用していないことでした。データベースの処理には時間がかかり、単一のdynoで処理されるため、他のAJAXリクエストを処理できませんでした。同時実行を許可するには、より多くのdynoが必要です。

ただし、これは推奨されません。現在サービスを使用しているユーザーごとにdynoが必要であり、さらに単純なAJAX要求を処理するために別のdynoが必要になるためです。ワーカー(HerokuがサポートするIronWorkerなど)を使用することをお勧めします。これにより、これらの長いプロセスによって、他のリクエストを処理しない程度にdynoがビジー状態にならないようになります。

于 2013-01-16T03:35:48.370 に答える