将$ _GET参数传递给cron作业

时间:2012-07-02 16:53:34

标签: php linux get cron

我是cron工作的新手,我不确定这是否可行。

出于安全考虑,我考虑制作一个寻找某些GET值(用户名,密码和安全代码)的单页脚本,以确保只有计算机和知道所有3的人才能运行该命令。

我创建了脚本并且它可以在浏览器中运行它,但是可以使用GET值运行cron作业吗?

一个例子就是我在运行

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

这可能吗?

9 个答案:

答案 0 :(得分:81)

$_GET[]&仅当通过Web服务器调用脚本时,才会初始化$_POST[]关联数组。通过命令行调用时,参数将在$argv数组中传递,就像C。

一样
  

包含传递给脚本的所有参数的数组   从命令行运行。

你的命令是:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234 

然后,您可以使用parse_str()设置和访问参数:

<?php

var_dump($argv);

/*
array(4) {
  [0]=>
  string(27) "/path_to_script/cronjob.php"
  [1]=>
  string(13) "username=test"
  [2]=>
  string(13) "password=test"
  [3]=>
  string(9) "code=1234"
}
*/

parse_str($argv[3], $params);

echo $params['code']; // 1234

答案 1 :(得分:10)

不是你问题的直接答案,而是我认为更好的解决方案:

如果您希望除cron之外的其他人都无法运行该脚本,只需将其放在Web根目录之外即可。这样就无法通过网络服务器进行访问。

如果您确实需要以特殊用户身份运行该命令,请不要使用GET但是要有用户登录并检查已登录的会话(某个设置的会话变量......)并仅在该页面中包含该脚本。

您可公开访问的脚本如下所示:

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}

答案 2 :(得分:5)

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

这不起作用

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

这有效

此外,您需要使用parse_str()函数并获取值

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

答案 3 :(得分:1)

您应该查看get_opt()$argv函数。

答案 4 :(得分:1)

我意识到这篇文章已经有好几年了,但是这篇文章对我帮助最大,所以让我分享我的发现以及帮助其他人。

我正在使用DirectAdmin,我的cron示例正在使用它们。我从“将所有Cron输出发送到电子邮件”中删除了我的电子邮件地址,因此我没有收到有关我的cronjobs的电子邮件通知。

我从一个每20分钟运行一次的cURL请求开始:

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'

请注意网址周围的'',否则您无法添加多个参数!

我使用该页面作为API启发的方式来触发我从其他网站收集的一些统计信息的更新,以及其他人可以从我的JSON表单中获取。 参数'update'触发更新过程,参数'key'将在验证时触发其他更新操作,我只想在cronjob请求更新时完成。

由于上面的cronjob基本上消耗了两个方向的带宽,我想去基于PHP的cronjob,但是遇到了参数的问题......所以当我发现这篇文章的时候节省了我的一天:)

*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234

正如您所看到的,文件名(index.php)现在包含在路径中,然后参数如下(没有?和&amp; s)。

这样你就得到了cronjob工作但是你只有一半的方法,因为参数不会通过$_GET传递...当你用脚本检查你的脚本编码时这有点烦人$_GET键!

那么,它是如何运作的呢?简单(至少在一些研究之后),cronjob通过名为$argv的变量将参数传递给脚本。

因此,凭借这些知识,我搜索了将$argv转换为$_GET的方法,以便:

  1. 我可以手动和通过cronjob触发更新。
  2. 我没有必要重写我的整个剧本。
  3. 我找到了以下解决方案,我们只想在$argv实际设置时执行,因此我将其包装在if isset检查中:

    if( isset( $argv ) )
    {
        foreach( $argv as $arg ) {
            $e = explode( '=', $arg );
            if( count($e) == 2 )
                $_GET[$e[0]] = $e[1];
            else    
                $_GET[$e[0]] = 0;
        }
    }
    

    希望这也有助于你:)

答案 5 :(得分:0)

这将有效:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

答案 6 :(得分:0)

当我需要来自cron或控制台命令的参数时,我发现使用getopt()函数很有用。

  

此函数将返回一个选项/参数对数组,如果失败则返回FALSE。

以下示例直接来自PHP文档。

$options = getopt("f:hp:");
var_dump($options);


shell> php example.php -fvalue -h

以上示例将输出:

array(2) {
    ["f"]=>
    string(5) "value"
    ["h"]=>
    bool(false)
}

有关更多选项和不同参数,请查看完整文档。

资源

答案 7 :(得分:0)

username=test&password=test&code=1234

将成为:

php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'

答案 8 :(得分:-1)

如果您的脚本在多个地方(不仅在您的 cronjob 中)被调用,并且您不想更改原始代码(即继续使用 $_GET['foo'], $_GET['bar']$_POST['foo'], $_POST['bar']),您可以使用wget(假设它存在/安装在您的服务器上)。

例如:

* 3 * * * wget -qO- 'http://yoursite.com/path_to_script/cronjob.php?username=test&password=test&code=1234' > /dev/null 2>&1

其中 -q 是用于安静模式(无输出)的选项,O- 表示 Output to stdout

由于响应不是您通常会保留的内容(保存到文件),/dev/null 2>&1 位确保您的脚本返回任何响应(echoprintf 等)不会保存在任何地方。