【问题标题】:How can I run PHP script in certain interval (e.g. once a day)?如何以特定的时间间隔(例如每天一次)运行 PHP 脚本?
【发布时间】:2009-05-14 19:57:58
【问题描述】:

我有一个通过 http 读取一个文件的 php 脚本(该文件位于其他域中)。我想每天只阅读一次或两次此文件,而不是每次刷新网站时都连接到它。 除了使用 cron 之外,还有其他方法吗? 我不想使用 cron,因为我更喜欢在脚本本身中设置这种行为。所以它很灵活,所以我可以在任何地方使用它,而无需每次都设置 cron。 谢谢

【问题讨论】:

    标签: php autorun


    【解决方案1】:

    我过去在无法访问 cron 时做过这种事情:

    $lastRunLog = '/path/to/lastrun.log';
    if (file_exists($lastRunLog)) {
        $lastRun = file_get_contents($lastRunLog);
        if (time() - $lastRun >= 86400) {
             //its been more than a day so run our external file
             $cron = file_get_contents('http://example.com/external/file.php');
    
             //update lastrun.log with current time
             file_put_contents($lastRunLog, time());
        }
    }
    

    【讨论】:

    • 这很聪明,不错!但是,我会更多地关注缓冲函数,因为它似乎更适合我的需要。
    • 但是你必须在区间运行上面的代码对吧?我的意思是你应该以某种方式继续检查当前时间和 lastRun 之间的差异。如果没有 cron,你是如何做到的?
    • 您可以让您的网站访问者运行它或从您有权访问 cron 的另一个系统调用它,等等。
    【解决方案2】:

    cron 出了什么问题?

    你有几个使用 cron 的选择——你的 php 可以由命令行 PHP 解释器调用,或者你可以使用 wget 或 fetch 或等效的方法在服务器上调用你的 PHP。

    一般来说,在 web 服务器的上下文中运行的 PHP 对它可以执行的时间有时间限制,所以通常你不能设置“后台”PHP 线程来“稍后”做一些事情。

    【讨论】:

    • 他特别要求 Cron 的替代方案,这就是我否决这个答案的原因。
    【解决方案3】:

    如果您在 *nix 环境中,您可以使用 cron jobs

    【讨论】:

      【解决方案4】:

      如果您不能或不想使用 cron,则可以仅在访问页面时更新它。您可以缓存 HTTP 请求的结果,并且仅在缓存超过一天或您选择的任何时间间隔时才在加载它的页面上更新它。

      【讨论】:

      • 谢谢,到目前为止,你是唯一一个明白我寻求 cron 以外的其他方式的人。我该如何做这个缓存? APC 是什么意思?
      • APC 是提供快速内存缓存的一种方式,但不是唯一方式。如果您希望能够在多台机器上分布缓存,则可以使用 memcached。或者,您可以只将副本插入数据库而不引入任何新技术。
      • 最简单的缓存方法应该是使用 PHP 的内置输出缓冲函数。 (php.net/manual/en/function.ob-start.php)
      【解决方案5】:

      如果您想按时间间隔访问网站,也可以使用Web Based Cron。

      【讨论】:

      • 我正在使用基于网络的 cron,因为我无法证明我的托管包上的 vpn 是合理的,我对此非常满意。谢谢指点
      【解决方案6】:

      您甚至可以使用数据库表 - 结构、id、日期、脚本 url 以及您需要的任何内容都非常简单 - 并在每次运行脚本时添加一行。

      然后,在运行脚本之前,只需检查您拥有的每一天的行数。

      【讨论】:

        【解决方案7】:

        您可以使用Cronjob。然后就可以通过命令行运行php脚本了。

        php /someplace/somefile.php
        

        如果您每天更新,Cronjob 将如下所示。

        0  0  *  0  0  php /someplace/somefile.php
        

        【讨论】:

          【解决方案8】:

          由于您明确声明您不想使用 cron,唯一的其他方法(没有类似于 cron 的东西)是将您的脚本设置为守护程序。但是,除非您真的需要守护程序提供的灵活性,否则 cron 会更容易和更简单。

          这是daemon walk-through。

          【讨论】:

            【解决方案9】:

            如果您使用的是带有 systemd 的 Linux 发行版:

            我需要安排基于年度的作业,独立于应用程序(以防系统重新启动或类似情况),并且有人建议我使用 systemd Timers。上面的 Arch Wiki Page 给出了一些例子。

            【讨论】:

              猜你喜欢
              • 2020-10-24
              • 2017-09-25
              • 2020-11-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-19
              • 2015-11-08
              • 1970-01-01
              相关资源
              最近更新 更多