【发布时间】:2018-04-10 01:06:14
【问题描述】:
我们需要分发应该包含一个 PHP 脚本的软件,该脚本将运行几分钟。因此,我正在寻找 2017 年的最佳实践方法。
- 它必须由 HTTP 请求调用。应该没有 HTTP 请求等待几分钟,因此脚本必须在访问者收到他的 HTTP 响应后继续运行。
- 它必须定期运行(每晚)。它还应该在默认情况下每晚运行一次(如 cron 作业)。注意:由于该软件将分发给客户端,因此我们无法手动添加 cronjob(我们无法访问我们的客户端服务器)。一切都应该在 PHP 代码中完成。
(请注意,我自己阅读了现有的博客文章和 Stackoverflow 问题,但找不到令人满意的答案)
也许有人知道像 Symfony 和 Laravel 这样的框架或像 Magento 这样的网上商店是如何完成这些任务的?我仍然想知道如何在不使用框架或库的情况下用纯 PHP 自己完成。
【问题讨论】:
-
这有点偏离 SO 的主题,但您希望将其作为非阻塞 CLI 脚本运行。不确定这是否是最佳实践,但我有一个关于这件事的课程。 github.com/ArtisticPhoenix/MISC/blob/master/BgProcess.php 适用于 CentOS 和 Windows。
-
@ArtisticPhoenix 是否可以将其称为 exec() (php.net/manual/de/function.exec.php) 对于 UNIX 和 COM 对象 (php.net/manual/de/class.com.php) 对于 Windows 的(非常方便的)包装器?
-
是的,windows 部分要让它非阻塞运行真的很痛苦。
-
是的,这是合理的。我将它与 Code Igniter 一起使用,因此它可以在参数中使用
/而不是{spaces}构造命令。这将用于路由到 CI 控制器。我不记得我是否从它的特定副本中清除了那些东西的所有依赖项。 -
你可能会发现这个很有用,github.com/ArtisticPhoenix/MISC/blob/master/ProcLock.php 这是 PHP 的一种进程锁定机制。基本上,它将进程 ID pid 存储在一个文件中,并且一次只允许您运行一个进程。如果运行时间比 Cron 循环时间更长,这对于阻止 Cron 启动进程的多个副本很有用。您可以执行多个过程,只需以不同的方式命名锁定文件。
标签: php laravel symfony magento cron