13

我在 PHP 中编写了一个长脚本,如下所示:

ignore_user_abort(true);
set_time_limit(0);

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

4

2 回答 2

29

当 PHP 脚本使用会话时,PHP 会锁定会话文件,直到脚本完成。尝试使用锁定会话的页面请求将被阻止,直到会话文件被释放。PHP 这样做是为了使会话保持一致的状态。引用 PHP 错误 #31464

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

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

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

  • 称呼session_start()
  • 读/写任何会话变量
  • 称呼session_write_close()
  • 做冗长的处理
于 2012-11-30T19:17:32.290 回答
10

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

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

于 2012-11-30T19:06:08.723 回答