【问题标题】:PHP script that works forever :)永远有效的 PHP 脚本 :)
【发布时间】:2012-02-04 17:26:49
【问题描述】:

我正在寻找一些想法来执行以下操作。我需要一个 PHP 脚本来执行很长一段时间的某些操作。这是 CMS 的扩展,只能是 PHP。它也不能是命令行脚本,因为它应该由只有 CMS 标准手段的普通人使用。其中一个选项是有一个 cron 作业(大多数简单的主机都有它),它会经常触发脚本,这样它就可以逐步执行操作,从一次启动到下一次保持其状态,而不是长时间工作。这并不完美,但我看不到任何其他解决方案。如果脚本将重定向到自身服务器将中断它。还有哪些适合的选择?

提前谢谢大家!

【问题讨论】:

  • 对,我们不希望您提前感谢,我们希望您事后感谢 ;)
  • PHP 中的功能不会在一夜之间被删除。您的 CMS(取决于复杂性)很可能会在您的脚本执行之前因为 PHP 升级而中断。

标签: php daemon


【解决方案1】:

您所说的是一个守护程序或长时间运行的程序,它等待客户端程序的调用、执行和操作,提供响应然后继续等待更多调用。

您可能熟悉这些以 Apache 和 MySQL 的形式出现的 ;) 无论如何,PHP 在这方面通常是可以的,它确实能够通过原始套接字以及 fork 子进程来同时处理多个请求.

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

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

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

另外,还有一个注意事项。守护进程确实会不时崩溃,因此您可能仍需要存储正在发生的事情的状态,以防有人通过电源线绊倒您的共享服务器:)

【讨论】:

  • 谢谢。这是一个不错的选择,但由于它将成为广泛分布的软件的一部分,因此大多数人将无法将脚本作为 php 守护进程启动
  • 好的,这很好,但这本质上就是一个“永远运行”的程序。如果您正在考虑广泛分布,那么如果 Windows 是所需的平台,您甚至可以将 cron 从列表中删除。有一些技术可以在 Apache look here 中模拟长时间运行的程序,但最好留给短程序使用。在 *nix 系统上拥有 root 访问权限的任何人都可以运行/安装守护程序。如果共享主机系统是软件 cron 的目标,那可能是要走的路。
  • 是的,我知道守护进程是什么,这将是一个非常好的选择,除非这适用于只能下载扩展并使用 CMS 的标准方式安装它的人(选择一个扩展文件并按“安装”)。
【解决方案2】:

我还建议您考虑将其设置为守护程序,但如果没有,那么您可以简单地使用

 set_time_limit(0);
 ignore_user_abort(true); 

在顶部告诉它不要超时,不要被任何事情打断。然后从 cron 中调用它以每天或其他方式启动它。我在许多长时间处理的日常任务中都有这个,它对我很有用。但是,它将无法轻松地与外界对话(其他脚本无法查询它或任何东西——如果这是您想要查看 php 服务的内容),因此一旦您运行它,请确保它会停止并让它将进度打印到日志文件中。

【讨论】:

  • 我也有这个想法,但我想知道托管服务提供商是否会监控他们的服务器以发现和中断此类脚本。另外我想知道托管服务提供商是否有办法禁用更改您提到的选项的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
相关资源
最近更新 更多