【发布时间】: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 条目的末尾。
> ~/test.log 2>&1它将所有输出发送到用户主目录中的日志文件。 -
我有另一个执行另一个 PHP 文件的 cron 作业。 PHP文件只是通过mysqli访问数据库并更新记录。这个PHP文件和leave_mail.php在同一个目录下。而且运行这个文件的cron作业完全没有问题。我的问题是运行 leave_mail.php 的 cron 作业,因为如果作业在服务器中,它不会执行命令,但是,如果我通过本地虚拟机上的 cron 作业运行它,它就可以正常工作。所以我真的很困惑发生了什么。
-
可以在服务器上手动运行文件吗?