PHP: 別のページでのセッションの読み込みを妨げずにページでセッションを使用する
P粉006977956
2023-08-08 13:05:15
<p>CURL を使用して、外部 URL から大きなファイルをダウンロードし、サーバーに保存しています。ちょっと時間かかります。ダウンロード中に、curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,..) を使用して匿名関数を実行し、$_SESSION['download_progress'] 変数を定期的に更新して現在のダウンロード情報を取得します。 </p>
<p>これらすべては、upload.php ファイル内で行われ、ユーザーがファイルのダウンロードを待っている間に、JavaScript を使用して、この単純なコードを含む progress.php ページをリクエストします。 </p>
<pre class="brush:php;toolbar:false;">session_start();
echo $_SESSION['download_progress'];</pre>
<p>これにより、JavaScript コードでダウンロードの進行状況に関する情報を表示できるようになります。 </p>
<p>ただし、それは機能しません。 </p>
<p>「upload.php」の読み込みが完了するまで「progress.php」ページは読み込まれません(つまり、ファイルのダウンロードが完了した後に2つのページが読み込まれます)。これは問題です。 session_start() は何らかの理由で「progress.php」ページの読み込みを妨げます。私は自分のサーバー (Apache php 5.4) を使用しているので、すべての管理者権限を持っています。 </p>
<p>この問題を解決するにはどうすればよいですか?ダウンロード情報をセッション変数の代わりにテキスト ファイルに書き込み、JavaScript を使用してそのテキスト ファイルを直接読み取るなど、見苦しい回避策を使用することもできますが、私はそれはやりたくありません。ありがとうございます</p><p><br /></p>
ファイル システム ベースのセッションの問題が発生しています。アップロード スクリプトは実行中にセッション バックエンド ファイルをロックするため、ロックが解除されるまでセッション情報にアクセスできません。
最も簡単な方法は、アップロード スクリプトで定期的にセッションを解放して再ロックすることです。これにより、同時に、進行状況スクリプトにセッションを読み取る機会が提供されます。
セッション ロックを解放するには、アップロード スクリプト内の任意の場所で session_write_close を呼び出します。これを行うと、後で session_start が再度呼び出されるまで、セッション変数にアクセスできなくなります。このサイクルを繰り返すことができます。
他にもより強力なソリューションがあります。たとえば、スクリプトの実行中にロックを保持しないストレージ メカニズムに進行状況情報を移動したり、セッション ID に基づいて各ユーザーの情報を識別したりできます (セッションが存在する場合、セッションを開始する必要はありません)。 ID を取得します)