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>"progress.php"頁面在"upload.php"完成載入之前不會載入(換句話說,在檔案下載完成之後兩個頁面才載入),這是不好的。 session_start()在某種程度上阻止了"progress.php"頁面的載入。我使用自己的伺服器(apache php 5.4),所以我有所有的管理員權限。 </p>
<p>我該如何解決這個問題?我可以使用一些不好看的解決方法,例如將下載資訊寫入文字文件而不是session變量,然後使用JavaScript直接讀取該文字文件,但我寧願不這樣做。謝謝</p><p><br /></p>
你遇到的是基於檔案系統的會話問題。上傳腳本在執行期間鎖定了會話後端文件,因此在釋放鎖定之前無法存取會話資訊。
最簡單的一個是讓您的上傳腳本定期釋放並重新鎖定會話;同時,這會為您的進度腳本提供讀取會話的機會。
要釋放會話鎖定,請在上傳腳本中的任何地方呼叫session_write_close。這樣做會使你無法存取會話變量,直到以後再次呼叫session_start。您可以重複執行此週期。
還有其他更強大的解決方案。例如,您可以將進度資訊移至某個在腳本執行期間不會保持鎖定的儲存機制;您可以根據會話ID來識別每個使用者的資訊(如果存在會話,您無需啟動會話即可獲得其ID )