php /var/www/html/*.php 在从菜单打开的终端中不起作用 php *.php 在 php 保存文件夹内打开的终端中起作用

php /var/www/html/*.php 在从菜单打开的终端中不起作用 php *.php 在 php 保存文件夹内打开的终端中起作用

我想从 cron 运行 PHP 脚本。我使用以下命令设置 cron:

*/1 * * * * php  /var/www/html/cron/cron_job.php

我可以在 中看到它crontab -u root -l,但作业未执行。当我直接从命令行运行命令时,它也不起作用,如下所示:

<?php  /var/www/html/cron/cron_job.php

我尝试了很多与 cron 相关的答案,但都不起作用。例如:

/usr/local/bin /var/www/html/cron/cron_job.php
/usr/local/bin/php /var/www/html/cron/cron_job.php
sudo php -f /var/www/html/cron/cron_job.php

测试 php 脚本(cron_job.php)是:

php file_put_contents  ('test.txt',"test content\n",FILE_APPEND);  

文件权限全部正常,并且在浏览器中运行或者在打开终端/var/www/html/cron/并运行时都可以正常工作php cron_job.php

根据评论中的要求,如果我附加2> /tmp/php.log使用php /var/www/html/cron/cron_job.php具有语法错误的脚本并尝试php /var/www/html/cron/cron_job.php 2> /tmp/php.log从菜单终端运行(),则错误日志会收到错误消息。

答案1

您的脚本几乎肯定会运行并创建文件。它只是没有在您期望的位置创建它。您没有在脚本中使用任何路径,而只是使用文件名。这意味着该文件将在脚本运行的目录中创建。

这就是为什么当您进入特定目录并在那里运行脚本时,您会认为它有效。因为文件是在运行它的目录中创建的,所以您可以看到它。默认情况下,cron在运行它的用户的主目录中运行。由于这是 root 的 crontab(顺便说一句,这不是一个好主意),因此文件将在中创建/root。所以,去检查一下:

sudo ls /root/test.txt

因此,下次,请为脚本提供完整路径,而不仅仅是文件名:

<?php file_put_contents  ('/path/to/test.txt',"test content\n",FILE_APPEND); ?>

现在,该文件将在 中创建/path/to

答案2

默认情况下,Cron 任务在用户的主目录中执行。如果您的脚本中未提供要保存输出文件的路径,则它将保存到执行脚本的目录中。

您的 PHP 脚本中缺少文件路径test.txt。您可以将其设置为绝对值,如 @terdon 所述回答,或者您可以将其作为相对路径提供(具有适当的来源)。例如,如果test.txt应该位于与 相同的目录中cron_job.php,则脚本的内容应如下所示:

<?php 
    $path = realpath(dirname(__FILE__)); 
    file_put_contents  ("$path/" . 'test.txt',"test content\n",FILE_APPEND);
?>

或者,如果您不想更改脚本,您可以按以下方式更改 Cron 作业:

*/1 * * * * cd /var/www/html/cron/ && php cron_job.php

相关内容