2

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

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

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

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

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

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

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

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

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

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

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

对不起所有的菜鸟问题。

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

再见!

4

2 回答 2

8

确保只运行一个脚本副本的最简单方法是使用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()这就是所谓的建议锁定方法,这意味着它只有在您使用时才有效。因此,这将阻止您自己的脚本多次运行,但不会对任何其他脚本执行任何操作,这在您的情况下听起来不错。

于 2009-11-23T02:49:52.437 回答
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

于 2014-11-30T16:06:14.527 回答