2012-02-04 74 views
0

我正在寻找一些想法来完成以下工作。我需要一个PHP脚本来执行相当长的时间。这是一个CMS的扩展,这不能只是PHP。它也不能成为一个命令行脚本,因为它应该被普通人使用,只有CMS的标准手段。其中一个选择是做一个cron工作(大多数简单的主机都有),它会经常触发脚本,以便长时间工作而不是长时间工作,可以一步一步地执行操作,从一次启动到下一次启动都保持其状态。这并不完美,但我看不到任何其他解决方案。如果脚本将重定向到自己,服务器将会中断它。还有什么其他选择可以满永久生效的PHP脚本:)

谢谢大家提前!

+1

对,我们不希望你提前致谢,我们希望你在此事后感谢;) – andrewtweber 2012-02-04 17:30:02

+0

PHP中的功能不会在夜间被删除。在您的脚本执行之前,您的CMS(取决于复杂性)很可能会因PHP升级而中断。 – kba 2012-02-04 17:33:42

回答

2

你在说什么是守护进程或长时间运行的程序,它等待客户端程序调用,执行和操作,提供响应,然后继续等待更多的调用。

您可能熟悉这些以Apache & MySQL的形式;)无论如何,PHP在这方面通常是可以的,它有能力通过原始套接字以及fork子流程来处理多个请求同时。

说了PHP守护进程是YMMV的工具。有些人会说他们工作得很好,像我这样的其他人会说他们在进程间通信和内存泄漏方面存在问题,即使在过多的unset()调用中也是如此。

无论如何,您可能无法在共享主机环境中部署任何类型的守护进程。您需要获得更好的服务器软件包或坚持使用基于Cron的解决方案。

Here's a link关于编写PHP守护进程。

另外,还有一个注意事项。守护进程不时崩溃,因此您可能仍需要存储关于发生了什么的状态,以防万一有人通过电源线跳到您的共享服务器:)

+0

谢谢。这是一个不错的选择,但由于它将成为广泛分布式软件的一部分,大多数人将无法以php守护进程的形式启动脚本 – AndreyM 2012-02-04 18:48:12

+0

好吧,这很好,但这基本上是一个永远运行的程序。如果你想分布广泛,那么如果Windows是一个理想的平台,你甚至可以将cron从列表中删除。有一些技巧来模拟Apache内的长时间运行的程序[看这里](http://moxune.com/blog/2011/04/non-blocking-web-service-processing-in-php/),但它们是最好留给短节目。任何在* nix系统上拥有root权限的人都可以运行/安装守护进程。如果共享主机系统是软件的目标,那么cron很可能是一条可行的路。 – quickshiftin 2012-02-04 18:59:00

+0

是的,我知道一个守护进程是什么,这将是一个非常好的选择,除非只有那些只能下载扩展并使用CMS的标准方式进行安装的人(选择扩展文件并按“安装”)。 – AndreyM 2012-02-04 19:28:04

1

我还建议您考虑制作它一个守护进程,但如果没有,那么你可以简单地使用

set_time_limit(0); 
ignore_user_abort(true); 

在顶部告诉它不要超时,不要让被任何中断。然后从cron中调用它来每天或任何地方启动它。我在许多长时间处理日常任务上都有这个功能,对我来说它非常有用。但是,它无法轻松地与外部世界交流(其他脚本无法查询它或任何其他脚本 - 如果这是您想要查看php服务的内容),那么一旦它启动,请确保它停止并且让它将进度打印到日志文件中。

+0

我也有这个想法,但我想知道托管服务提供商是否监视他们的服务器以发现并中断这些脚本。另外我想知道是否有托管提供商禁用更改您提到的选项的功能的方法。 – AndreyM 2012-02-04 19:15:35