PHP:如何在一个页面上使用会话,而另一个会话页面正在加载

时间:2013-02-19 19:54:26

标签: php curl session-variables progress

我使用CURL从外部URL下载大文件并将其保存在我的服务器上。 这可能需要几分钟。 下载正在运行时,我正在使用curl_setopt($ ch,CURLOPT_PROGRESSFUNCTION,..来运行匿名函数,该函数定期使用当前下载信息更新我的$ _SESSION ['download_progress']变量。

现在,所有这一切都发生在upload.php文件中,当用户正在等待文件下载时,我使用javascript来请求progress.php页面,其中包含以下简单代码:

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

这允许我的javascript代码显示有关下载进度的信息。

除非它不起作用。

“progress.php”页面将不会加载,直到“upload.php”完成加载(换句话说,两个页面仅在文件完成下载后加载)并且这不好。 session_start()以某种方式阻止加载“progress.php”页面。 我使用自己的服务器(apache + php 5.4),所以我拥有所有管理权限。

我该如何解决这个问题? 我可以使用一些丑陋的解决方法,比如将下载信息写入文本文件而不是会话变量,然后使用javascript直接读取该文本文件,但我宁愿不这样做。

由于

1 个答案:

答案 0 :(得分:3)

您遇到了文件系统支持的会话的经典问题。您的上传脚本会锁定会话后备文件的持续时间,因此在释放锁定之前无法访问会话信息。

这里有几种可能的解决方案,但最简单的解决方案是让您的上传脚本定期释放会话并再次锁定它;这将为您的进度脚本留出机会在此期间阅读会话。

要释放会话锁定,请在上传脚本的任何位置致电session_write_close。这使您无法访问会话变量,直到稍后再次调用session_start。您可以根据需要重复此循环。

还有其他更有能力的解决方案。例如,您可以将进度信息移动到某个存储机制,该机制在脚本持续时间内不会保持锁定状态;您可以根据会话ID识别每个用户的信息(您不需要启动会话以获取其ID(如果存在)。