Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将$\u GET参数传递给cron作业_Php_Linux_Get_Cron - Fatal编程技术网

Php 将$\u GET参数传递给cron作业

Php 将$\u GET参数传递给cron作业,php,linux,get,cron,Php,Linux,Get,Cron,我是cron jobs的新手,不确定这是否可行 出于安全目的,我考虑制作一个单页脚本,查找特定的GET值(用户名、密码和安全代码),以确保只有计算机和知道所有3个值的人才能运行该命令 我制作了脚本,它可以在浏览器中运行,但是否可以使用GET值运行cron作业 比如我跑步 * 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234 这可能吗?不是对你问题的直接回答,而是一个更好的解决方案,

我是cron jobs的新手,不确定这是否可行

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

我制作了脚本,它可以在浏览器中运行,但是否可以使用GET值运行cron作业

比如我跑步

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

这可能吗?

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

如果您希望除了cron之外没有人运行该脚本,只需将其放在web根目录之外。这样,就根本无法通过web服务器进行访问

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

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

session_start();

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

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

只有通过web服务器调用脚本时,才会初始化
$\u GET[]
&
$\u POST[]
关联数组。当通过命令行调用时,参数在数组中传递,就像C

包含一个数组,其中包含在 从命令行运行

你的命令是:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234 
然后,您将使用设置和访问参数:

<?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
您应该查看or函数

这行不通

* 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

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

我使用的是DirectAdmin,我的cron示例两者都可以使用。我从“将所有Cron输出发送到电子邮件”中删除了我的电子邮件地址,因此我不会收到cronjobs的电子邮件通知

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

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'
请注意URL周围的“”,否则无法添加多个参数

我使用该页面作为一种受API启发的方式来触发我从另一个网站收集的一些统计数据的更新,其他人可以从我的网站获取JSON格式的统计数据。 参数“update”触发更新过程,参数“key”在验证后将触发其他更新操作。我只想在cronjob请求更新时执行这些操作

由于上面的cronjob基本上在两个方向上都消耗带宽,所以我想使用基于PHP的cronjob,但遇到了参数问题。。。就在那时,我发现这篇文章救了我一天:)

正如您所看到的,文件名(index.php)现在包含在路径中,随后是参数(没有?和&)

通过这种方式,您可以使cronjob正常工作,但由于参数不会通过
$\u get
。。。当您使用检查
$\u GET
键对脚本进行编码时,这有点烦人

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

因此,有了这些知识,我搜索了一种将
$argv
转换为
$\u GET
的方法,因此:

  • 我可以手动或通过cronjob触发更新
  • 我不必重写我的整个剧本
  • 我找到了以下解决方案,我们只希望在实际设置了
    $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;
        }
    }
    

    希望这对您也有帮助:)

    当我需要cron或console命令中的参数时,我发现使用
    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)
    }
    
    有关更多选项和不同参数,请参阅完整文档

    资源

    用户名=测试和密码=测试和代码=1234

    将成为:


    php-r“$\u-GET[“username”]=“test”;$\u-GET[“password”]=“test”;$\u-GET[“code”]=“1234”;包括“wp-cron.php”;

    如果脚本在多个位置被调用(不仅在cronjob中),并且您不想更改原始代码(即继续使用
    $\u-GET['foo']、$\u-GET['bar'
    $\u-POST'foo'、$/bar>),您可以使用(假设它存在/安装在您的服务器上)

    例如:

    * 3 * * * wget -qO- 'http://yoursite.com/path_to_script/cronjob.php?username=test&password=test&code=1234' > /dev/null 2>&1
    
    其中
    -q
    是用于安静模式(无输出)的选项,
    O-
    表示
    输出到标准输出


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

    是否因为某种原因而为您隐藏了已被接受的答案?!这是唯一对我有效的解决方案。获得_GET.干杯,伙计!问题是parse_str似乎覆盖了params。至少在PHP7.1中我会这样。当您使用parse_str()时第二次数组只包含最后一个值。我不确定这是错误还是故意的。
    array(2) {
        ["f"]=>
        string(5) "value"
        ["h"]=>
        bool(false)
    }
    
    * 3 * * * wget -qO- 'http://yoursite.com/path_to_script/cronjob.php?username=test&password=test&code=1234' > /dev/null 2>&1