仅通过cron运行php脚本

6
我知道如何在cron中运行脚本,但我需要的是只能通过cron来运行我的脚本。
谢谢!

你可以更具体一些吗?你想要将你的 PHP 脚本从网络隐藏,只通过 Cron 使用它? - Jerome WAGNER
2
可能是[PHP&cron:安全问题]的重复问题(https://dev59.com/y1LTa4cB1Zd3GeqPa3_I) - ajreal
请查看被选择为重复问题的答案。 - Alin Purcaru
5个回答

6
你应该将此脚本放在公共文件夹之外。此外,设置适当的权限以使公共用户无法执行脚本。 将下面的代码片段放置在脚本的顶部。
if(php_sapi_name() !== 'cli'){
    die('Can only be executed via CLI');
}

请注意,在设置 cron 作业时,您需要使用 PHP 可执行文件的完整路径。
例如:/usr/local/bin/php(您的路径可能与此不同)。

3

正如在这个重复的线程中所解释的那样:

PHP和cron:安全问题

您应该将此文件保存在public_html之外。

但有时这是不可能的。我的想法转向Moodle,他们使用了类似的功能。下面是他们的做法。

cron.php文件:

...

/// The current directory in PHP version 4.3.0 and above isn't necessarily the
/// directory of the script when run from the command line. The require_once()
/// would fail, so we'll have to chdir()

    if (!isset($_SERVER['REMOTE_ADDR']) && isset($_SERVER['argv'][0])) {
        chdir(dirname($_SERVER['argv'][0]));
    }

...

/// check if execution allowed
    if (isset($_SERVER['REMOTE_ADDR'])) { // if the script is accessed via the web.
        if (!empty($CFG->cronclionly)) { 
            // This script can only be run via the cli.
            print_error('cronerrorclionly', 'admin');
            exit;
        }
        // This script is being called via the web, so check the password if there is one.
        if (!empty($CFG->cronremotepassword)) {
            $pass = optional_param('password', '', PARAM_RAW);
            if($pass != $CFG->cronremotepassword) {
                // wrong password.
                print_error('cronerrorpassword', 'admin'); 
                exit;
            }
        }
    }

...

5
如前所述,这并非总是可能的。向某人讲解这一点很好,但下次请考虑到不可能性。 - Sweepster

1
请在您的PHP文件顶部添加此脚本:
$isCLI = ( php_sapi_name() == 'cli' );
if( !$isCLI )
    die("Sorry! Cannot run in a browser! This script is set to run via cron job");

如果您尝试通过浏览器运行PHP文件,则无法运行它,会显示此错误消息。但同时,它可以通过cron作业运行。


1

-2

尝试仅为cron守护程序用户授予执行权限,也许这样你就能得到想要的结果。

敬礼!


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