首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crontab PHP执行

Crontab PHP执行
EN

Stack Overflow用户
提问于 2018-12-07 13:28:37
回答 3查看 324关注 0票数 1

Crontab不执行我的php文件。

我已经设置了"crontab -e“,如下所示

代码语言:javascript
复制
*/1 * * * * /usr/bin/php /var/www/html/books_loader/cron_jobs/CronBooksLoader.php

如你所见,我希望它每分钟都能运行。我的php文件夹是"/usr/bin/php“。我的"CronBooksLoader.php“位于正确的目录下,它拥有所有必要的权限(甚至777)。

"CronBooksLoader.php“包含以下代码

代码语言:javascript
复制
<?php
namespace BooksLoader\Base;

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

$bookObj = new Books();

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

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

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

*更新*

在发表了这么多评论之后。Cron运行并创建日志。我搞错了

代码语言:javascript
复制
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

但我想不出怎么才能找到一条正确的道路。我希望它保持相对。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-07 13:50:28

如果你不太清楚,请使用curl**,** lynx wget.

脚本执行是在中进行的,是在两个非常不同的环境中执行的,具体取决于您是使用HTTP还是使用PHP二进制。

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

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

代码语言:javascript
复制
require '../vendor/autoload.php';

当您在/var/www/yoursite/htdocs中运行它或在/tmp中运行它时,意味着两种不同的事情(cron的work通常在那里)。

还有,还有其他的区别。通常,您会使用特定的“利用”脚本来修改环境,使其模拟Web请求,并在其中运行脚本。或者在CLI脚本中使用完全不同的方法(不同的DB连接等等)。

如果您不准备这样做,那么使用curl就更好了。

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

另外:在cron脚本中,一定要添加一个"2>&1“重定向,以捕获任何stderr消息并将它们发送给您:

代码语言:javascript
复制
* * * * * /usr/bin/curl http://www.yoursite.com/cron_jobs/CronBooksLoader.php 2>&1

(*/1与*相同)

=利用实例

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

代码语言:javascript
复制
<?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.
        );
    }
?>
票数 2
EN

Stack Overflow用户

发布于 2018-12-07 13:51:47

确保您的当前计算机上安装了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

票数 0
EN

Stack Overflow用户

发布于 2018-12-10 16:57:27

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

它的不足是:

从着色环境中排除帐户 要将某个用户从着色环境中排除在外,只需访问cron.exclude文件夹并创建以下空文件: /var/spool/cron.exe/user.chroot

将帐户排除在全局限制之外 要将某个用户排除在全局限制之外,您需要创建以下文件: /var/spool/cron.exe/spool.限值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53670589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档