将$ _GETparameter passing给cron作业

我在cron的工作是新的,我不知道这是否会工作。

为了安全起见,我考虑制作一个页面脚本,查找某些GET值(用户名,密码和安全代码),以确保只有计算机和知道所有3的人都可以运行该命令。

我做了脚本,它的工作原理在浏览器中运行,但有可能使用GET值运行cron作业吗?

一个例子就是我跑步

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

这可能吗?

Solutions Collecting From Web of "将$ _GETparameter passing给cron作业"

$_GET[]$_POST[]关联数组只在您的脚本通过Web服务器调用时才初始化。 当通过命令行调用时,参数在$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 

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

如果您希望除cron以外的其他人无法运行该脚本,请将其放置在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 

这是行不通的

 * 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 

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

这将工作:

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

当我需要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) } 

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

资源

  • getopt() – PHP文档

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

我使用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,但遇到了一个问题的参数…所以这是当我发现这个职位,保存了我的一天:)

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

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

这样,你得到的cronjob工作,但你只是一半的方式,因为参数将不会通过$_GET传递…这是有点烦人,当你已经编码脚本检查$_GET键!

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

所以有了这些知识,我搜索了一个方法来将$argv转换为$_GET所以:

  1. 我可以通过手动和通过cronjob触发更新。
  2. 我不必重写我的整个脚本。

我发现下面的解决方案,我们只想在$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; } } 

希望这也能帮助你:)

username=test&password=test&code=1234

将成为:

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