5

私は、主にFlashクライアントによって使用されるPHPで記述されたAPIのバックエンド部分を担当しています。現在行われていることは、Flashクライアントが呼び出しを行い、バックエンドが必要なデータをロードし、必要な処理と後処理、ロギングとキャッシングを実行してから、結果をクライアントに返すことです。

私がしたいのは、できるだけ早くデータをクライアントに返し、接続を閉じてから、クライアントが気にする必要のないすべてのことを実行することです。これにより、APIの応答性が大幅に向上する可能性があります。ここでの提案に従う:

http://php.net/manual/en/features.connection-handling.php

実際に機能しますが、機能させるにはgzipエンコーディングをオフにする必要がありますが、これはあまり実用的ではありません。Apacheでmod_deflateを使用するので、それで機能するソリューションが理想的ですが、必要に応じて、コンテンツをgzipで圧縮する別の方法も検討します。

Apacheに「送信するすべてのデータを送信しました」と通知する方法があるはずですが、そのようなものは見つからないようです。

疑問に思っている人のために、はい、結果を早期にフラッシュすることはできますが、Flashクライアントは接続が閉じられるまで結果を処理しません。

4

5 に答える 5

3

2 ページに分けてみてください。

最初のページで必要な処理を行い、curl を介して 2 ページ目をロードし、die() を実行します。

これにより、2 番目のページの処理とは関係なく、最初のページが完了して閉じます。

すなわち:

ページ1:

<?php

// Do stuff

// Post or get second page...

// Send Data to client

die();
?>

ページ2:

<?php

// Do other stuff....

?>

http://www.php.net/curlを参照

于 2009-10-09T00:38:00.343 に答える
0

@Theo.Tコメントシステムが私のコードからがらくたを台無しにして以来、私はそれをここに投稿しています:

運がない。以下は余分ながらくたを出力し、mod_deflate を使用している場合、接続を閉じるのに完全な実行時間がかかります:

function sleepLongTime() { 
    print "you can't see this";
    sleep(30);
}
ob_end_clean();
register_shutdown_function('sleepLongTime');
header("Connection: close\r\n");
ignore_user_abort(true);
ob_start();
echo ('Text user will see');
ob_end_flush();
flush();
ob_end_clean();
die();
于 2009-10-09T18:32:01.677 に答える
0
set_time_limit(0);
header("Connection: close");
header("Content-Length: " .(strlen($stream)+256));
ignore_user_abort(true);

echo $stream;
echo(str_repeat(' ',256));
@ob_flush();
@flush();
 @ob_end_flush();

your_long_long_long_long_function_here();

$streamこれにより、すべてを受信したら接続を閉じるようにユーザーに指示されます。headerただし、知っている部分の前に何もエコーしないように注意してください:p

バイナリ データ (swf) を送信する場合は、「+256」を削除する必要があるかもしれませんecho(str_repeat(' ',256));が、この場合、送信されたデータが 256 バイト未満の場合、コードは「失敗する可能性があります」。

于 2011-04-04T16:33:29.760 に答える
0

経由で登録されたコールバック メソッド内に接続が閉じた後に実行するコードを配置することで、これを行う一種のハックがあります。register_shutdown_function();

于 2009-10-09T02:04:06.597 に答える
-1

今日、私はこのケースにも遭遇しました。いくつかのテストの後、この方法が機能することがわかりました。

2 つのステップ:

  1. PHPスクリプトの出力がgzipエンコーディングを使用していないことを確認してください。解決策は次のリンクを参照できます:

    <IfModule mod_env.c>
    SetEnvIfNoCase Request_URI "\.php$" no-gzip dont-vary
    </IfModule>

上記を.htaccessprj Web サイトのファイルに追加し、apache gzip を自動的に回避します。

  1. で何人かが言ったようにfeatures.connection-handling.php

    set_time_limit(0); 
    ignore_user_abort(true);    
    // buffer all upcoming output - make sure we care about compression: 
    if(!ob_start("ob_gzhandler")) 
        ob_start();         
    echo $stringToOutput;    
    // get the size of the output 
    $size = ob_get_length();    
    // send headers to tell the browser to close the connection    
    header("Content-Length: $size"); 
    header('Connection: close');    
    // flush all output 
    ob_end_flush(); 
    ob_flush(); 
    flush();    
    // close current session 
    if (session_id()) session_write_close(); //close connection
    
    // here, do what you want.
    
于 2012-02-15T04:19:01.710 に答える