【问题标题】:Symfony command runned by cron, but no effect. Runs fine on command linecron 运行 Symfony 命令,但没有效果。在命令行上运行良好
【发布时间】:2017-12-24 09:04:31
【问题描述】:

我目前正在使用 Symfony 2.7 制作邮件客户端。我已经发出命令来使用 IMAP 收集新邮件并从中创建实体。 该命令在命令行中运行良好,它收集并显示新邮件。

命令如下:

protected function configure()
{
    parent::configure();
    $this
        ->setName('app:mails:collect')
        ->setDescription('Collects new mails from every Mailboxes.');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
    $em = $this->getContainer()->get('doctrine')->getEntityManager();

    $mailboxes = $em->getRepository('MIPMailBundle:MailBox')->findAllActive();

    foreach ($mailboxes as $mailbox){
        $imapBox = new ImapMailbox('{'.$mailbox->getServer().':143/notls/norsh/novalidate-cert}INBOX',
                                    $mailbox->getAdress(), $mailbox->getPassword(), "web/mails/", "UTF-8");

        if (count($mailbox->getMails()) == 0){
            $output->writeln("Getting mails from mailbox...");
            $mailsIds = $imapBox->searchMailbox('ALL');
            if(!$mailsIds) {
                $output->writeln($mailbox->getAdress() . " is empty");
            }
        } else {
            $output->writeln("Searching for new mails...");
            $mailsIds = $imapBox->searchMailbox('UNSEEN');
            if(!$mailsIds) {
                $output->writeln("No new mail for " . $mailbox);
            }
        }

        foreach ($mailsIds as $mailId){

            //Creates new mail entities...

            $imapBox->markMailAsRead($mailId);
        }
    }

    $em->flush();
}

我希望服务器每分钟运行一次此命令。所以我为此做了一个 cronjob:

* * * * * /path/to/myapp/app/console app:mails:collect

但如果由 cron 运行,该命令将不起作用。我试图将输出写入文件,但文件为空。在 cron 日志中,我可以看到已执行的作业:

Jul 19 09:39:01 dev CRON[26967]: (web) CMD (/path/to/myapp/app/console app:mails:collect)

但它不起作用...我试图通过在命令中指定环境来指定环境(我在开发环境中工作):

* * * * * /path/to/myapp/app/console app:mails:collect --env=dev

这不成功。知道为什么吗?谢谢

【问题讨论】:

  • 控制台的路径是相对的还是绝对的?
  • 告诉我你的 cron 文件中的确切命令
  • 我的 crontab 中的确切命令是:* * * * * /var/www/MIP/app/console mip:mails:collect --env=dev 所以它是绝对路径,是的
  • 你必须使用 php 运行它
  • * * * * * php /var/www/MIP/app/console mip:mails:collect --env=dev

标签: php symfony cron


【解决方案1】:

尝试指定php可执行路径:

* * * * * /path/to/php /path/to/myapp/app/console app:mails:collect --env=dev

例如:

* * * * * /usr/bin/php /path/to/myapp/app/console app:mails:collect --env=dev

【讨论】:

  • 我尝试了php路径,没有进一步的效果。 Jul 19 10:33:01 mip-dev CRON[29046]: (web) CMD (/usr/bin/php /var/www/MIP/app/console mip:mails:collect --env=dev)这就是日志所说的,但没有新实体:(
  • 尝试记录命令输出,并检查 tmp.log 是否有错误: * * * * * /usr/bin/php /path/to/myapp/app/console app:mails:collect >> /var/log/tmp.log
  • 如果你用绝对路径改变“web/mails/”有什么变化吗?
  • "网络/邮件" ?我不明白。我在命令中使用绝对路径,就是这样:* * * * * php /var/www/MIP/app/console mip:mails:collect --env=dev>>/var/www/MIP/log.log
  • 这里:$imapBox = new ImapMailbox('{'.$mailbox->getServer().':143/notls/norsh/novalidate-cert}INBOX', $mailbox->getAdress() , $mailbox->getPassword(), "web/mails/", "UTF-8");
【解决方案2】:

这对我来说很好。 cd 先进入目录然后运行。这样做看看会发生什么。

* * * * * cd /path/to/myapp && php app/console app:mails:collect --env=dev

使用bin/console 或app/console!取决于您的设置。

注意:当您用尽选项时,请尝试使用一个非常简单的命令(例如将“hello world”打印到终端)来查看它是您的命令还是其他命令。 p>

【讨论】:

  • 我试过这个(完整的命令):* * * * * cd /var/www/MIP && php app/console mip:mails:collect --env=dev>>/var/www/MIP/log.log 并且运行良好!!为什么我必须先 cd 在我的应用程序目录中?这不是有点奇怪吗? oO 非常感谢 BentCoder!
  • 它通常应该在没有cd 的情况下工作,但有时当事情不工作时,我们必须以不同的方式做事。这次是人工处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 2019-03-28
  • 2020-03-09
  • 2017-02-04
相关资源
最近更新 更多