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)