0

CURL を使用して外部 URL から大きなファイルをダウンロードし、サーバーに保存しています。これには数分かかる場合があります。ダウンロードが実行されている間、curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,.. を使用して、現在のダウンロード情報で $_SESSION['download_progress'] 変数を定期的に更新する匿名関数を実行しています。

現在、これはすべて upload.php ファイルで行われており、ユーザーがファイルのダウンロードを待っている間に、javascript を使用して、次の単純なコードを含む progress.php ページを要求します。

session_start();
echo $_SESSION['download_progress'];

これにより、JavaScript コードでダウンロードの進行状況に関する情報を表示できます。

それが機能していないことを除いて。

「upload.php」のロードが完了するまで「progress.php」ページはロードされません (つまり、両方のページはファイルのダウンロードが完了した後にのみロードされます)。これは良くありません。session_start() は、何らかの方法で「progress.php」ページの読み込みをブロックします。私は自分のサーバー (apache + php 5.4) を使用しているので、すべての管理者権限を持っています。

どうすればこの問題を解決できますか? ダウンロード情報をセッション変数の代わりにテキスト ファイルに書き込み、javascript を使用してそのテキスト ファイルを直接読み取るなど、いくつかの醜い回避策を使用することもできますが、それは避けたいと思います。

ありがとう

4

1 に答える 1

3

ファイルシステムでサポートされているセッションには、古典的な問題があります。アップロード スクリプトは、その期間中セッション バッキング ファイルをロックするため、ロックを解除するまでセッション情報にアクセスすることはできません。

ここにはいくつかの解決策がありますが、最も簡単な方法は、アップロード スクリプトで定期的にセッションを解放し、再度ロックすることです。これにより、進行スクリプトがその間にセッションを読み取る機会が残ります。

セッション ロックを解除するにはsession_write_close、アップロード スクリプトから任意の時点で呼び出します。session_startこれにより、後で再度呼び出すまで、セッション変数にアクセスできなくなります。このサイクルを好きなだけ繰り返すことができます。

他にも、より有能なソリューションがあります。たとえば、スクリプトの実行中にロックされたままにならないストレージ メカニズムに進行状況情報を移動できます。セッション ID に基づいて各ユーザーの情報を識別できます ( ID が存在する場合は、ID を取得するためにセッションを開始する必要はありません)。

于 2013-02-19T20:04:08.140 に答える