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)。

于 2013-02-19T20:04:08.140 回答