【问题标题】:Separated php process stop all site分离的php进程停止所有站点
【发布时间】:2013-06-30 19:52:22
【问题描述】:

我想运行一个单独的php进程,在我的服务器中,进程分开运行,但是当这个测试运行时,站点的所有其余部分都不工作,即整个站点都在等待他完成.

当我使用时:

忽略用户中止(真); 设置时间限制(0); 而(真) { 睡眠(10); }

上面的代码完美运行,但是当我包含注册表、控制器和数据库驱动程序时,站点的其余部分仍在等待

例如:

忽略用户中止(真); 设置时间限制(0); //注册表、控制器、数据库等 而(真) { //代码[...] 睡眠(10); }

【问题讨论】:

  • 那是因为脚本永远不会返回。脚本在做什么?
  • 我认为重要的是您要尝试找出 //code[...] 中的哪些内容使其他页面“挂起”。一个试错的游戏。如果您知道是什么命令使 php '挂',那么这里的用户可能会告诉您如何解决它。
  • 任何会话正在使用中?如果是这样,请注意会话使用锁定。您可以通过尽快调用session_write_close() 来避免它,然后只从会话变量中读取。
  • 你不应该在网络服务器中运行这样的事情,然而,如果你必须,在长期运行的事情中调用session_write_close() ,因此它不会阻止使用相同会话 id 的其他请求。
  • @tlens 是的,但我认为它不应该挂 other 页面。他还声称第一段代码“完美运行”,这意味着第二部分无限运行代码中的某些内容正在阻止其他 php 进程运行(或挂起其他 php 进程中的类似代码部分)。

标签: php


【解决方案1】:

如果你使用会话,你应该阅读 php 的会话锁定模型,特别是参见session_write_close()

这里也可能存在网络服务器限制,只有这么多的工作进程或线程可用。有许多网络服务器和许多安装 php 的方法,但是,无论如何,如果您耗尽工作池,如果您执行诸如 sleep() 之类的操作或其他需要很长时间的操作,您将挂起网络服务器。

一般来说,您应该将长时间运行的脚本完全排除在您的网络服务器之外。编写一个单独的后台进程来做这些事情。

【讨论】:

  • 好的,问题是缺少 session_write_close();
猜你喜欢
  • 2011-02-09
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2018-09-18
相关资源
最近更新 更多