如何在cron中运行PHP脚本

4
我发现很多关于这个问题的问题和文章,但我仍然有些困难。 我正在使用以下命令: /usr/bin/php home/domain.com/public_html/cron/script.php 我收到以下错误: 状态:404未找到 X-Powered-By:PHP/5.2.8 内容类型:text/html
未指定输入文件。
我正在使用Cpanel,在domain.com/cron/script.php上托管文件。 有任何想法,谢谢:p
5个回答

11

在脚本名称前加上斜杠,即:

/usr/bin/php /home/domain.com/public_html/cron/script.php

除非你确实打算像lacqui的回答那样通过网络运行脚本,并且你不介意随机第三方随时运行它,否则没有理由将其放在public_html目录内;相反,你应该避免这样做。


我在这里补充一下,因为对于提问者来说可能不是很明显:当随机的第三方能够“随时”运行它时,我也指的是“每秒多次”。由于 CPU 密集型和内存密集型任务通常是 cron 作业的候选项,你可能会给人们提供一个简单的拒绝服务攻击。 - chaos
只有在确保它没有在运行之前才执行。使用数据库创建一个“CRON上次启动于”时间戳的保护机制。然后在你的cron中,如果时间戳是X分钟/小时之前的,则不执行。 - jmucchiello
实际上这可能行不通。最好使用cd /home/domain.com/public_html/cron/ && /usr/bin/php script.php来正确设置工作目录。 - Cem Kalyoncu
该作业不会在非公共文件夹中运行。例如,/home/username/etc/cron.php无法工作,但如果放在公共文件夹中,则可以正常工作。 - TheTechGuy

7

尝试:

wget -O - http://domain.com/cron/script.php

尝试一下,看看是否能得到更好的结果。

编辑:添加了“-O-”以避免将输出写入主文件夹。


我的代码可能可行,但你或许应该看一下Chaos更合理的回答。 - Kevin Lacquement
这对我来说很有效!我的PHP脚本还有一些命令编码来安排邮件发送。谢谢@Lacqui。 - McElie

1
我意识到这是一个老问题,你可能已经找到了解决方案,但上面的答案都没有帮助到我,当我运行cron脚本时,我也遇到了同样的404错误。
问题与php脚本路径的编写方式有关。路径必须从public_html开始,像这样:/usr/bin/php public_html/public/index.php

1

你可能需要使用名为php-cli的二进制文件,而不仅仅是php。


这是针对Windows的,而在nix中,您只需使用/usr/bin/php。通过提到cron,它肯定是在nix环境下。 - Cem Kalyoncu
@cemykalyoncu:一些系统会安装一个单独的php-cli,其中包含额外的内容,比如readline等等。这在命令行中非常方便。 - X-Istence

0
在一些共享主机上,cron 中不支持 wgetcurl 命令。如果想要从 cron 执行一个 web (http) 请求,可以在 cron php 脚本中调用所需的 web url 作为 php curl 来完成。
以下是一个示例代码,可放置在 cron php 文件中:
<?php
function callRemoteHttp($url)
{

    $curl = curl_init();    

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);
    $ret_arr = array('data' => $result, 'status_code' => curl_getinfo($curl, CURLINFO_HTTP_CODE));
    curl_close($curl);

    return $ret_arr;
}
$ret = callRemoteHttp('http://example.com?param1=value1&param2=value2');
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接