2012-08-15 140 views
1

我目前有一个网站已被我的托管服务提供商两次暂停“过度使用系统资源”。在每种情况下,我的一个PHP脚本在服务器上剩下300-400个拷贝。PHP脚本崩溃和最大执行时间

脚本本身从家里的网络摄像头拉出图像并将其复制到服务器。他们利用文件锁来确保一次只能写入一个文件。任何查看页面的客户端都会每3秒调用一次脚本。

最初我很困惑,因为我已经理解PHP脚本完成(返回结果)或崩溃(返回内部服务器错误页面)。然而,我知道“已停用的脚本”是非常普遍的现象。

任何人都可以教育我吗?我已经谷歌搜索到死亡,但我看不到脚本可以在崩溃的状态下结束。当它达到最大执行时间时会不会超时?

我的托管服务提供商在Linux平台上将PHP设置为CGI。我相信我实际上已经发现我的脚本存在这个问题,因为我没有意识到这个群是一个阻塞函数(并且我没有使用LOCK_NB掩码)。我假设以某种方式,我的脚本的数百个副本最终阻止等待资源变得可用,并导致崩溃?这听起来似乎合理吗?我不愿意重新启用该网站,以免再次被暂停。

任何见解非常感谢。

+0

我看不出为什么你需要一个文件锁定 - 或者更重要的是,为什么多个运行脚本需要写入同一个文件。这听起来像你可能在setInterval()方法上调用ajax,而应该在前一个ajax调用的成功处理程序中调用'setTimeout()'。如果你是'flock()'文件,确保你在完成之后立即记住'LOCK_UN',并且记住如果你正在读它,你不需要'LOCK_EX','LOCK_SH '就足够了。 – DaveRandom 2012-08-15 12:12:01

+0

这听起来像是实际提供商的问题;他们是否使用Apache/suPHP? – 2012-08-15 12:23:40

+0

@Jack起初,我认为这实际上可以通过mod_php来看到(刚刚测试过) - 因为'flock()'会阻塞,当你在* nix上运行时,如果脚本从不到达锁定队列的顶部。这是非常愚蠢的,但显然是这样。在['set_time_limit()'手册页](http://php.net/manual/en/function.set-time-limit.php)上也有关于此的说明。 – DaveRandom 2012-08-15 12:28:43

回答

0

脚本可能崩溃的这两个限制

  • 的max_execution_time
  • memory_limit的

与资源工作时,除非你有脚本没有其他错误/检查通知的错误太

1

可能我建议的方法是首先使用tempnam(),然后写入内容(可能需要一段时间)。一旦完成,你做文件锁定等。

不知道当PUT请求正在完成时是否发生这种情况;通常PHP会在将执行交给脚本之前处理文件上传。

+0

谢谢杰克。要重写我的脚本,结合Dave的上述建议,尝试一下。对不起,我是一个新用户,无法投票,但无论如何表示赞赏。 – Lewis 2012-08-15 15:30:05