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

use*_*305 0 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'];
Run Code Online (Sandbox Code Playgroud)

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

除非它不起作用。

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

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

谢谢

Jon*_*Jon 5

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

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

要释放会话锁定,请session_write_close随时从上传脚本中调用。这使您无法访问会话变量,直到您session_start稍后再次调用。您可以根据需要重复此循环。

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