【问题标题】:Crontab PHP executioncrontab PHP 执行
【发布时间】:2019-05-09 06:46:52
【问题描述】:

Crontab 不执行我的 php 文件。

我的“crontab -e”设置如下

*/1 * * * * /usr/bin/php /var/www/html/books_loader/cron_jobs/CronBooksLoader.php

如您所见,我希望它每分钟运行一次。 我的 php 文件夹是“/usr/bin/php”。我的“CronBooksLoader.php”位于正确的目录中,并且拥有所有必要的权限(甚至是 777)。

“CronBooksLoader.php”包含此代码

<?php
namespace BooksLoader\Base;

require '../vendor/autoload.php';

$bookObj = new Books();

$loadFiles = $bookObj->load('../xmlData');
$result = $bookObj->upsert();

当我在浏览器中启动时 (http://127.0.0.1/books_loader/cron_jobs/CronBooksLoader.php) 成功地从该目录中的 XML 文件加载了我的数据。

我不能 100% 确定该文件是否未执行,或者只是该 cron 不知道该做什么。

*******更新*******

在下面所有的 cmets 之后。 Cron 运行并创建日志。 我收到错误

PHP Warning:  require(../vendor/autoload.php): failed to open stream: No such file or directory in /var/www/html/books_loader/cron_jobs/CronBooksLoader.php on line 4
PHP Fatal error:  require(): Failed opening required '../vendor/autoload.php' (include_path='.:/usr/share/php') in /var/www/html/books_loader/cron_jobs/CronBooksLoader.php on line 4

但我不知道如何给出正确的路径。我希望它留下来 相对的。

【问题讨论】:

  • 首先,将权限设置为 777 对于 php 文件来说绝不是一个好主意。使用 755 应该足够了
  • 我知道@SvenHakvoort 那时我很绝望......
  • 好吧 :) 只是为了确保 xD 你可以尝试在你的 crontab 中的 php 命令之后使用&gt;&gt; /var/log/cron.log 2&gt;&amp;1 记录结果吗?所以:*/1 * * * * /usr/bin/php /var/www/html/books_loader/cron_jobs/CronBooksLoader.php &gt;&gt; /var/log/cron.log 2&gt;&amp;1
  • 检查错误日志
  • 请记住,当在文件路径中使用点时,它会从脚本运行的路径转换它,而不是脚本所在的位置。要么将要求更改为绝对路径,要么将 cd 添加到您的 crontab 到脚本目录。

标签: php xml cron


【解决方案1】:

TL;如果您不太了解,请使用curllynxwget

脚本执行发生在两种截然不同的环境中,具体取决于您使用的是 HTTP 客户端还是 PHP 二进制文件。

当您通过 curl、lynx 或 wget 调用它时,它会在 Web 服务器的环境中执行。当您通过 PHP 二进制文件调用它时,它会在命令行环境 (CLI) 中执行。

最明显的区别之一是工作目录不同,因此这一行:

require '../vendor/autoload.php';

当您在 /var/www/yoursite/htdocs 中运行它或在 /tmp 中运行它(cron 的工作目录通常在那里)时,意味着两种不同的东西。

还有 很多 其他差异。通常,您会使用特定的“线束”脚本来修改环境以使其模仿 Web 请求,并通过该脚本运行您的脚本。或者您会在 CLI 脚本中使用完全不同的方法(不同的数据库连接等)。

如果您不准备这样做,那么最好使用curl

即使这样,验证主机名是否匹配(机器可能不“知道”它的网站地址对应于什么,或者可能无法正确连接到它。您可能需要添加网站名称(例如“www.yoursite .com”)在 /etc/hosts 中,地址为 127.0.0.1,和/或在环回接口上添加监听端口和网站别名 127.0.0.1。否则,您会注意到“curl @ 987654321@" 无法连接、超时或报告一些 HTTP 错误。

另外:在 cron 脚本中,请务必添加“2>&1”重定向以捕获任何 stderr 消息并将它们邮寄给您:

* * * * * /usr/bin/curl http://www.yoursite.com/cron_jobs/CronBooksLoader.php 2>&1

(*/1 同 *)

=线束示例

与其说是一种工具,不如说是对需要在两种上下文中执行的文件的修改。

<?php
    if (php_sapi_name() === 'cli') {
        // Simulate a Web call.

        $dir   = dirname(__FILENAME__);
        // We must know how deep in the Web hierarchy this file is,
        // and the CLI does not know. We must tell it.
        // The root web directory has depth 0.
        $depth = 1;
        while($depth--) {
            $dir = dirname($dir);
        }
        chdir($dir);

        // Prepare a $_SERVER
        $_SERVER = array(
            'REMOTE_ADDR' => '127.0.0.2',
            // Add as needed.
        );
    }
?>

【讨论】:

  • * * * * * cd /var/www/html/books_loader/vendor; /usr/bin/php /var/www/html/books_loader/cron_jobs/CronBooksLoader.php > /tmp/php.log 2>&1 完美运行,但我仍然很生气,没有“CD”命令我无法做到选择供应商文件夹。有没有办法让路径保持相对但同时适用于 cron 和 web ?
  • @Beni 添加到答案。您需要修改 CronBooksLoader 文件。
【解决方案2】:

确保您当前的机器上安装了 cron。

在 CentOS/RHEL 上:

yum install cronie

在 Linux/Unix 上:

apt-get install cron

尝试在 Linux/Unix 上使用crontab -e cron

查看有关 cron 的答案以获取更多详细信息:https://serverfault.com/questions/449651/why-is-my-crontab-not-working-and-how-can-i-troubleshoot-it

【讨论】:

  • 100% 已安装。不需要安装。
  • 尝试运行php /var/www/html/books_loader/cron_jobs/CronBooksLoader.php 脚本是否运行?
【解决方案3】:

在某些可能运行 cPanel 并使用 1H 的共享主机上,您的 crons 可能在不同的环境中运行。这意味着您正在被监禁的环境中运行(例如无法访问主目录之外的文件)或限制您的内存等。有关详细信息,请参阅此页面: http://docs.1h.com/index.php?title=Crond

它的短处:

从 chrooted 环境中排除帐户

从你刚刚拥有的 chrooted 环境中排除某个用户 访问 cron.exclude 文件夹并创建以下空文件:

/var/spool/cron.exclude/USER.chroot

从全局限制中排除帐户

要将某个用户排除在您需要创建的全局限制之外 以下文件:

/var/spool/cron.exclude/USER.limits

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 2019-06-06
    • 2016-03-02
    • 2016-04-07
    • 2019-10-26
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多