代码之家  ›  专栏  ›  技术社区  ›  thesunneversets

PHP脚本从命令行工作,而不是从cron

  •  0
  • thesunneversets  · 技术社区  · 15 年前

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

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

    脚本本身——这是我认为可能太古怪的一点,以至于通过数据库中Realtors表的一个子集抛出cron-loops,使用系统时间来决定要更新数据库的哪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循环和更新大量的数据库记录,从而防止单个查询太大而系统无法处理?

    EDIT:它不仅总是从命令行工作,而且在由cron脚本在不同服务器上运行时也能工作。我想是某个服务器出了点问题,所以有没有与代码相关的解决方案是值得怀疑的!我只接受下面与cron相关的有用见解中的一个答案。。。

    4 回复  |  直到 15 年前
        1
  •  0
  •   Rahly    15 年前

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

    /路径/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
  •  0
  •   Kamil Szot    15 年前

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

        3
  •  0
  •   deceze    15 年前
        4
  •  -1
  •   Arantor    15 年前

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

    您可能想尝试:

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

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

    我假设你的PHP文件也包含了必要的#!第一行指向PHP解释器,文件权限允许从命令行执行?(也就是说,你可以直接运行上面的语句,它就可以工作了)