【问题标题】:PHP loop acting as cronjob[ensure only one instance running]PHP 循环充当 cronjob[确保只运行一个实例]
【发布时间】:2010-12-19 08:16:45
【问题描述】:

我有一个关于 php 脚本文件的多部分问题。我正在创建这个每秒更新数据库的文件。没有其他建模方法,必须每秒完成一次。

现在我正在运行 CentOS,我是新手。第一个菜鸟问题是:

如何通过 SSH 运行 php 文件。我读到它只是#php path-to/myfile.php。但是我试图回应一些东西,我没有在文本中看到它。

现在我认为启动文件不会有问题。我想一个问题是,我什至不知道这是否可能,但就是这样。

我是否有可能百分百确定该文件只运行一次。如果我不小心再次运行该文件会发生什么。

我进一步想知道,如果我每秒执行一次日志写入,我可以知道一切是否运行正常。如果出现错误或错误,日志文件将停止。

是用fopen 写入日志文件,然后写入和关闭。这不是要花很多时间吗,CentOS中没有更简单的方法吗。

好的,我的另一个重点是运行文件时会发生什么。文件是在内存中运行,还是使用系统中的文件。它是否响应文件中所做的更改,例如停止脚本的执行。

我可以在文件本身中实现某种停止机制吗?或者有没有我可以用来停止文件的命令。

我知道的另一个选项是实现每分钟运行的 cronjob。这个 cronjob 执行 php 文件。 php 文件将循环一分钟,更新所有需要的内容,然后终止。我实现了这个方法,但只是使用了浏览器。我只是浏览到 mu 文件,然后打开它。我看到浏览器忙了一分钟,但它没有更新数据库中的任何内容。有谁知道这是什么原因。

我的另一个问题是通过实施 cronjob 方法,我在 PLESK 面板中填写的命令是什么。是不是和上面的命令一样。只是 php 和文件名。或者有没有特殊的命令,比如 -f -q -something。

抱歉所有菜鸟问题。

如果有人可以帮助我,我真的很感激。

Ciao!

【问题讨论】:

  • 您可能希望将您的问题分成单独的条目。
  • 同意达雷尔。坚持一个问题或每个问题的问题更有可能获得有用的答案。

标签: php mysql ssh centos cron


【解决方案1】:

确保只运行一个脚本副本的最简单方法是使用flock() 获取文件锁定。例如:

<?php

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // do an exclusive lock
    ftruncate($fp, 0); // truncate file
    fwrite($fp, "Write something here\n");
    flock($fp, LOCK_UN); // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

?>

所以基本上你会设置一个虚拟文件,你的脚本在启动时会尝试获取锁。如果成功,它就会运行。如果没有,则退出。这样,您的脚本一次只能运行一个副本。

注意: flock() 是所谓的advisory 锁定方法,这意味着它只有在您使用时才有效。因此,这将阻止您自己的脚本多次运行,但不会对任何其他脚本执行任何操作,这在您的情况下听起来不错。

【讨论】:

  • 我实际上尝试过使用它,但一个实例让我明白了。它是这样的:在执行脚本时,文件被锁定现在将继续执行它的操作,让你只在一个带有大量数据的数据库中查询,突然之间,cronjob 停止并失败了。现在锁定文件仍然被锁定并且没有被释放。这将导致脚本永远不会被执行。遇到这种情况你是怎么处理的?
【解决方案2】:

您不能总是依赖脚本本身的锁定,如对先前答案的评论中所述。这可能是一个解决方案。

#Mins  Hours  Days   Months  Day of week
  *     *      *      *       *   lockfile -r 0 /tmp/the.lock; php parse_tweets.php; rm -f /tmp/the.lock
  *     *      *      *       *   lockfile -r 0 /tmp/the.lock; php php get_tweets.php; rm -f /tmp/the.lock

这样即使脚本崩溃,锁文件也会被释放。取自这里:https://unix.stackexchange.com/a/158459

【讨论】:

  • lockfile 不一定会出现在给定的系统上。如果不是,则需要安装 procmail 包。
猜你喜欢
  • 2014-12-29
  • 2017-10-01
  • 2010-09-27
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多