4

ajax 経由で開始される PHP スクリプトがあります。この PHP スクリプトは、exec() を使用して、シェル経由で別の PHP スクリプトを実行します。

exec() 経由で呼び出されるスクリプトは、完了するまでに 30 秒程度かかる場合があります。完成したらUIを更新する必要があります。

これらのオプションのどれが優先されますか?

a) HTTP 接続を 30 秒間開いたままにして、終了するまで待ちます。
b) exec() で PHP スクリプトをバックグラウンドで実行し、ajax ポーリングを使用して完了を確認します (5 秒ごと)。
c) 私が思いもよらなかった他の何か。

ありがとう、ブライアン

4

4 に答える 4

2

数秒ごとに更新のためにサーバーをポーリングします。接続を開いたままにしておくと、サーバーまたはブラウザによって接続が切断される可能性が常にあります (HTTP 要求に時間がかかりすぎると、ブラウザがタイムアウトします)。

于 2010-06-02T18:59:26.990 に答える
1

AJAXオプションは私には良いようです。1つの代替手段は、必要なトラフィックを最小限に抑えるためのComet(Ajax Push)スタイルです。サーバーは、何かを言わなければならないときにクライアント(ブラウザー)に信号を送信します(UIの更新)。

于 2010-06-02T20:31:06.467 に答える
1

a)タイムアウトに問題があり、サーバー要求をロックする可能性があります(通常、サーバーが接続を受け入れる制限を設定します)。多くのユーザーがサーバーにリクエストを追加すると、サーバーをロックできます。http環境では、必要な場合にのみ接続を開いたままにします。

b)30秒の長さの場合、毎秒のように頻繁にポーリングすることはありません。ポーリング時間を増やします。実行時間は常に30秒ですか?ポーリングスタイルの例(ペイロードはjsonです):


# trigger job/execution
POST /job
=> response gives 301 redirect to /jobs/{job-id}

# polling
GET /jobs/{job-id}
=> {status:busy}
or
=> {status:completed,result:...}
 

しかし、最終的には問題によって異なります。私はb)が好きですが、実装するのにより多くの労力が追加されます。多分あなたはより多くの詳細を持っていますか?トラフィックの多いシナリオですか?

于 2010-06-02T20:32:28.043 に答える
1

オプション b) は、私には少しステートフルすぎるように感じます。サーバーは 30 秒が経過したら要求を受信する必要がありますか? そうしないと、サーバーは悪い状態になりますか? (リソースなどを放棄しないように)もしそうなら、間違いなくa)methinksで行きます。

c) については、 AJAX パターンの Web サイトBrowser-Server Diaglogで何かを見つけることができるかもしれません。

于 2010-06-02T19:01:29.260 に答える