【问题标题】:How to restart PHP script every 1 hour?如何每 1 小时重启一次 PHP 脚本?
【发布时间】:2013-09-03 09:37:23
【问题描述】:

我在 Linux 服务器上有一个 php 脚本,运行如下:

nohup php myscript.php > /dev/null &

此脚本需要每小时重新启动一次。我怎样才能自动做到这一点?

注意:脚本具有无限运行的功能。因此,当它启动时,它必须保持打开状态。所以在脚本再次运行之前,必须将其杀死。

【问题讨论】:

  • Cron / Crontab 就是你要找的,google it。
  • 使用 cron 你甚至可能不需要 nohup...
  • 脚本具有无限运行的功能。因此,当它启动时,它必须保持打开状态。所以在脚本再次重新运行之前,它必须被杀死。
  • 按照其他人告诉您的那样使用 Cron,或者如果您已经创建了一个守护进程,则通过分叉一个新子进程并杀死父进程来重新启动它 - 每小时一次。

标签: php


【解决方案1】:

要添加一个 cronjob 使用:

    crontab -e

然后

   0 * * * *   timeout 3600  nohup php myscript.php > /dev/null &

timeout 参数将在此示例中在'3600' 秒后终止进程

更新

你也可以使用

  set_time_limit(3600);

在您的 php 文件的开头,它将在 3600 秒后杀死它

【讨论】:

  • 此脚本将运行 1 小时,然后将其杀死并重新运行,因为每小时 cron。但是,如果它在重新启动后立即终止该进程怎么办?这 60 分钟的 cron 和 60 分钟的超时将正确对齐以每小时重新运行脚本?我们怎么能确定呢?如果我确定 3599 或 3590 秒怎么办?
  • 也感谢您的简单回答。我还有其他类似的脚本。他们都在不同的目录中。编写 crontab 的完整路径对他们来说就足够了吗?
  • 是的,您可以执行减少 3600 之类的操作,但是当 cronjob 再次运行时,它将启动一个新进程,因此杀死前一个进程不会成为问题,但您可以减少它以确保只有一个在给定时间运行。
  • 你写完整路径根本不是问题。
  • 使用您向我展示的 crontab,我在 cron 中收到“糟糕的分钟错误”。为什么会这样?
【解决方案2】:

通过运行无限循环并等待进程完成的 shell 脚本启动脚本。 由于您的 PHP 脚本中还有一个无限循环,因此只有在您的脚本停止时才会出现这种情况。

接下来,您将脚本的 PID 写入文本文件。 你应该得到这个PID: http://php.net/manual/en/function.getmypid.php

下一步是设置一个每小时运行一次的 cronjob。 此 cronjob 读取 PID .txt 文件,将其删除并终止进程。

由于开头提到的shell脚本也有一个没完没了的lopp,所以会直接重启php进程。


示例脚本:

启动脚本:

#!/bin/bash
while true
do
  php myscript.php > /dev/null
done

保存它,例如作为 start.sh 并设置 chmod +x 以便能够执行它。

现在您可以开始: nohub ./start.sh &

在 .php 中,你在开头做这样的事情:

file_put_contents("/tmp/yourscript.pid", getmypid());

这是 cron 脚本作为 bash:

#!/bin/bash
PID=`cat /tmp/yourscript.pid`
rm /tmp/yourscript.pid
kill -9 $PID

你也可以用php到cron脚本:

<?php
$pid=file_get_contents("/tmp/yourscript.pid");
unlink("/tmp/yourscript.pid");
shell_exec("kill -9 $pid");

【讨论】:

  • 感谢您的详细解答。所以一开始的shell脚本将从终端启动。但是其他从文件中读取 PID、将其删除然后终止进程的 shell 脚本将从 cron 运行。在这里,我们将终止 PHP 脚本,但 shell 脚本会使其再次运行。伟大的。但问题是我不知道 bash 脚本,现在我需要查看 bash 示例来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 2016-11-21
  • 2014-10-18
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多