Dfr*_*373 34 php linux cron get
我是新来的cron工作,我不确定这是否会奏效.
出于安全考虑,我考虑制作一个单页脚本来查找某些GET值(用户名,密码和安全代码),以确保只有计算机和知道所有3的人才能运行该命令.
我制作了脚本,它可以在浏览器中运行它,但是可以使用GET值运行cron作业吗?
一个例子就是我跑步
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Run Code Online (Sandbox Code Playgroud)
这可能吗?
Rob*_*obB 84
在$_GET[]与$_POST[]当你的脚本通过Web服务器调用关联数组对象仅被初始化.通过命令行调用时,参数将在$argv数组中传递,就像C一样.
包含从命令行运行时传递给脚本的所有参数的数组.
你的命令是:
* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
Run Code Online (Sandbox Code Playgroud)
然后,您将使用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
Run Code Online (Sandbox Code Playgroud)
jer*_*oen 10
不是你问题的直接答案,而是我认为更好的解决方案:
如果您希望除cron之外的其他人都运行该脚本,只需将其放在web-root之外.这样就无法通过网络服务器进行访问.
如果您确实需要以特殊用户身份运行该命令,请不要使用GET但具有用户登录并检查已登录的会话(某个设置的会话变量...)并仅在该页面中包含该脚本.
您可公开访问的脚本看起来像:
session_start();
if (isset($_SESSION['user']))
{
include '/path/to/script/outside/of/web-root';
}
else
{
die('No access.');
}
Run Code Online (Sandbox Code Playgroud)
gol*_*abs 10
我意识到这篇文章已经有好几年了,但这篇文章对我帮助最大,所以让我也分享我的发现,以帮助其他人。
我正在使用 DirectAdmin,并且我的 cron 示例都可以使用。我从“将所有 Cron 输出发送到电子邮件”中删除了我的电子邮件地址,这样我就不会收到有关我的 cronjobs 的电子邮件通知。
我从每 20 分钟运行一次的 cURL 请求开始:
*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'
Run Code Online (Sandbox Code Playgroud)
请注意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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,文件名 (index.php) 现在包含在路径中,然后是参数(不带 ? 和 &)。
这样你就可以让 cronjob 工作了,但是你只完成了一半,因为参数不会通过$_GET…传递,当你用键检查来编写脚本时,这有点烦人$_GET!
那么,它是如何运作的呢?很简单(至少经过一些研究),cronjob 通过名为 的变量将参数传递给脚本$argv。
因此,有了这些知识,我寻找一种方法将其转换$argv为$_GET:
我找到了以下解决方案,我们只想在$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;
}
}
Run Code Online (Sandbox Code Playgroud)
希望这也对你有帮助:)
小智 5
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Run Code Online (Sandbox Code Playgroud)
这不行
* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
Run Code Online (Sandbox Code Playgroud)
这有效
此外,您需要使用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
Run Code Online (Sandbox Code Playgroud)