【问题标题】:Sending HTTP request through cron job通过 cron 作业发送 HTTP 请求
【发布时间】:2021-01-25 19:20:09
【问题描述】:

我有一个部署在服务器中的 PHP 文件:

/var/www/html/cron/leave_mail.php

这个 PHP 文件中的代码只是通过 CURL 发送请求(url 的服务器与 cron 作业的服务器相同):

<?php

$url = "http://my-site.build.com/sendmail/sendmail_leave";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // remove body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);

curl_close($ch);

?>

现在我在部署 PHP 文件的同一台服务器上创建了一个 cron 作业:

* * * * * php /var/www/html/cron/leave_mail.php

1分钟后,它没有执行PHP文件中的命令,但是,我可以在系统日志中看到cron作业正在运行。

我用 ubuntu 操作系统运行我的本地虚拟机并创建了相同的 cron 作业,执行相同的文件。 1分钟后,我可以看到它执行了PHP文件中的命令,因为数据库上的数据被更新了。

我真的很困惑为什么服务器上的 cron 作业没有执行 PHP 命令。我被这个问题困住了。

【问题讨论】:

  • 在某些系统上,您还需要指定 PHP 的路径:/usr/bin/php 或任何可能的位置
  • 您需要区分它根本无法执行 PHP 脚本,以及 PHP 以某种方式崩溃,以及 cURL 请求没有按照您的预期执行。确保 PHP 已打开错误日志记录,并且您记录来自 cURL 请求的响应,将对此有所帮助。另请参阅unix.stackexchange.com/questions/207/…(和其他人)了解有关找出 cron 作业出了什么问题的信息。
  • 将此添加到 crontab 条目的末尾。 &gt; ~/test.log 2&gt;&amp;1 它将所有输出发送到用户主目录中的日志文件。
  • 我有另一个执行另一个 PHP 文件的 cron 作业。 PHP文件只是通过mysqli访问数据库并更新记录。这个PHP文件和leave_mail.php在同一个目录下。而且运行这个文件的cron作业完全没有问题。我的问题是运行 leave_mail.php 的 cron 作业,因为如果作业在服务器中,它不会执行命令,但是,如果我通过本地虚拟机上的 cron 作业运行它,它就可以正常工作。所以我真的很困惑发生了什么。
  • 可以在服务器上手动运行文件吗?

标签: php curl cron


【解决方案1】:

从寻找 PHP 在哪里开始:

which php

然后通过运行以下命令更新 crontab:

crontab -e

然后用正确的 PHP 路径更新该行:

* * * * * root /usr/bin/php /var/www/html/cron/leave_mail.php

还请注意,您可以在路径之前指定用户。 希望这会有所帮助。

【讨论】:

  • which php 可能比whereis php 更好。后者给了我一个很大的段落,但第一个给了我一个简单的路径。
  • 我有另一个 cron 作业,但正在运行不同的 PHP 文件(与 leave_mail.php 相同的目录)。不过,该 PHP 文件并未通过 CURL 发送请求。那个 cron 工作没有问题。这就是我感到困惑的原因。
  • 可能是curl在php.ini的disable_functions列表中。 php.net/manual/en/ini.core.php#ini.disable-functions
猜你喜欢
  • 2012-06-16
  • 2013-01-15
  • 2015-09-24
  • 1970-01-01
  • 2014-07-29
  • 2022-01-11
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多