【问题标题】:Can I run FuelPHP Task in single process ?我可以在单个进程中运行 FuelPHP 任务吗?
【发布时间】:2015-09-03 06:30:05
【问题描述】:

我想通过 cron 每分钟运行 FuelPHP 任务。 但我不想运行重复的 FuelPHP 任务。

你有什么想法吗?

我试图通过 pid 控制,但是 getmypid() 总是返回相同的值...

【问题讨论】:

  • 你可以编写一个脚本,第一次检查fulephp的前一个实例是否正在运行,如果运行get pid并杀死它。每分钟将脚本添加到 cron 作业中
  • 感谢您的回复。你怎么知道以前的fuelphp实例正在运行?请?
  • 如何运行任务? getmypid 应该可以工作。你在哪里叫它?
  • 我正在使用 FuelPHP 任务。炼油 my_task_name。我在 "public function run()" 中写了 getmypid。 getmypid 结果始终为 5000。
  • 这很奇怪。如果您以某种方式从浏览器运行任务,那么显然问题是返回了网络服务器的 pid,这在请求之间不会改变。但是,如果您从终端(或从 cron)运行 oil refine task_name,那应该始终是一个新进程。我尝试创建一个空任务并运行它,结果每次都显示不同的 pid……我猜应该是你的设置问题。

标签: php linux fuelphp


【解决方案1】:

另一个解决方案是(如果您不需要将数据发送到您的进程,但它会读取数据本身(例如从数据库中))您可以使用具有长时间运行任务的进程管理器(基本上在无限循环中) )。 (实际上,在基于队列的解决方案中您还需要一个流程管理器,因为它需要接收方的工作人员)

我通常为此使用Supervisord

一个简单、长时间运行的应用程序:

while (true) {
    // do something
    sleep(1);
}

supervisord 的优点是它可以在由于某种原因停止时重新启动您的进程。

【讨论】:

  • 谢谢。这是解决我的问题的想法之一。
【解决方案2】:

对于此类任务,您最好的选择可能是使用某种排队系统。我找到了最好看的Bernard。你应该看看。

(编辑:我根据您的任务不重叠的需要对您的任务做了一个假设,这就是我推荐队列的原因。如果这对您来说是新事物,请查看它们,并决定哪个更适合您,如果它不适合您,搜索单个任务关键字的人可能仍然会发现队列有用,因此我将其留在答案中。)

如果你的环境由于某种原因不允许这样的解决方案,或者你真的只需要一个方法来判断前一个进程是否正在运行,你应该在临时目录中创建一个锁文件,比如@ 987654323@ 任务开始时,并在任务终止(完成或崩溃)时将其删除。然后您可以检查该文件是否存在。

这是解决此问题的常用解决方案,但使用队列系统更灵活,也更优雅。

其他可能性是使用 pidfiles,它不是空的,而是存储第一个运行任务的进程 ID,因此您甚至可以终止它,或向它发送消息。与 lockfiles 相同,您将其放在临时目录中,并将其命名为 mytask.pid(或任何您想要的名称,但 *.pid 很常见)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 2014-09-17
  • 1970-01-01
  • 2016-02-23
  • 2016-01-08
  • 2020-08-05
  • 2016-11-25
相关资源
最近更新 更多