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

mar*_*cpt 10 php session background-process

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

ignore_user_abort(true);
set_time_limit(0);
Run Code Online (Sandbox Code Playgroud)

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

Sal*_*n A 23

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

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

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

上面和这里描述的最简单的解决方法是:

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


Nie*_*sol 7

正如评论中提到的,会话是问题 - 这是因为会话文件被锁定.

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