【问题标题】:PHP script works from command line, not from cronPHP脚本从命令行工作,而不是从cron
【发布时间】:2024-06-21 04:40:01
【问题描述】:

我有一个 CakePHP 脚本,希望它可以由 cron 作业运行。它从命令行运行良好,但似乎不能从 cron 运行。 cron 行类似于:

*/2 * * * * cd /path/to/app;../cake/console/cake do_update

脚本本身——我认为这可能太古怪了,以至于抛弃了 cron——循环通过数据库中 Realtors 表的子集,使用系统时间来决定哪 50 个-记录要更新的数据库片段:

$realtors = $this->Realtor->find('all',array(
'conditions'=>array('Realtor.zone_id'=>1),
'order'=>array('Realtor.num DESC'),
'limit'=>50,
'offset'=>date("i")*25
));

所以我的问题是/是 - 我在这里做的任何事情显然会使 cron 工作陷入循环吗?而且,也许更重要的是,我在一个小时内将数据库拆分为可管理的块的方法是否疯狂? (我几乎是一个编程新手,所以我在不知道它们是否是好的做法的情况下尝试了很多东西。)任何人都可以提出一种更好的方法来通过 cron 循环和更新大量数据库记录,即防止单个查询太大而系统无法处理?

编辑:它不仅总是从命令行工作,它也可以在不同服务器上由 cron 脚本运行时工作。我想特定服务器上只是有些东西搞砸了,所以似乎有一个与代码相关的解决方案值得怀疑!我会从下面有用的 cron 相关见解中接受答案...

【问题讨论】:

    标签: php mysql cakephp cron


    【解决方案1】:

    通常,您希望将所有命令行内容放入一个 shell 文件中

    /path/to/cake/console/cron.sh

    #!/bin/sh cd /path/to/app php ../cake/console/cake do_update */2 * * * * sh /path/to/cake/cron.sh

    通常我不关心应用程序的实际启动位置(如果我不使用文件),我只是这样做

    */1 * * * * php /my/path/my_php.php

    【讨论】:

      【解决方案2】:

      我会尝试将“cd /path/to/app;../cake/console/cake do_update”放在 bash 脚本中,然后在 cron 中运行该脚本。但我不确定它是否会有所帮助。

      【讨论】:

        【解决方案3】:

        尝试按照手册进行操作,它对我很有用:
        http://book.cakephp.org/view/1110/Running-Shells-as-cronjobs

        【讨论】:

          【解决方案4】:

          我对 cron 不太熟悉,但我不认为你可以像那样同时运行两个命令。

          你可能想试试:

          */2 * * * * cd /path/to/app && ../cake/console/cake do_update
          

          这将导致两个命令一起运行(因为每个命令都会返回一个数字来指示成功或失败,如果失败,则会返回一个错误代码)

          我假设您的 PHP 文件还包含必要的 #!开头的行指向 PHP 解释器,并且文件权限允许从命令行执行? (即你可以直接在上面运行该语句并且它可以工作)

          【讨论】:

          • 考虑到如果没有 shebang,它在我的生产服务器上不起作用,并且每种脚本语言都完全相同...我认为您确实需要 shebang,除非文件实际上是二进制文件可执行文件。我之前确实说过,我不太了解 cron,而且我猜蛋糕 - 作为 CakePHP 构建的文件 - 实际上有 shebang 吗? (这称为检查中的尽职调查。)
          • @sberry Shebangs 适用于 PHP 脚本,它与这里的任何其他脚本语言没有什么不同。它在 PHP 中的使用频率低于在 Perl 脚本中的使用频率。
          最近更新 更多