长时间运行的后台PHP脚本会阻止其他PHP页面,直到完成为止

时间:2012-11-30 18:44:39

标签: php session background-process

我在PHP中制作了一个长脚本:

ignore_user_abort(true);
set_time_limit(0);

即使我关闭页面,它也能在后台完美运行。我的问题是,在此脚本在后台运行之前,我无法打开其他PHP文件。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:21)

当PHP脚本使用会话时,PHP会锁定会话文件,直到脚本完成。尝试使用锁定会话的页面请求将被阻止,直到会话文件被释放。 PHP执行此操作以使会话保持一致状态。 Quote from PHP bug #31464

  

[2005-01-10 08:13 UTC] derick at php dot net

     

这确实不是一个bug,会话扩展需要锁定   会话文件,以便并发更新不会破坏文件。   这意味着需要使用相同会话文件的所有脚本   序列化。为了提高性能,您可以使用   完成后http://php.net/session_write_close {$ 3}}   读取/设置会话变量,这将删除锁定   文件。

上述最简单的解决方法和here as well是:

  • 致电session_start()
  • 读/写任何会话变量
  • 致电session_write_close()
  • 做冗长的处理

答案 1 :(得分:6)

如评论中所述,会话是问题 - 这是因为会话文件被锁定。

在长时间运行的脚本中使用session_write_close()来解锁会话文件,但请注意,之后您不能在该特定脚本中使用$_SESSION变量。