我目前正在为几个人运行cronjobs,要知道这些人是谁,我给它一个带有一些细节的参数:
0 1 * * * cd /var/www; php auto.php?user=user
由于某种原因它会返回此结果:
无法打开输入文件:auto.php?user = user
语法有什么问题吗?我必须编码吗?
答案 0 :(得分:6)
在命令行中使用参数PHP是不同的
命令应该是
php auto.php myuser
然后在脚本中使用$_SERVER['argv']
超全局数组访问变量 - 每个命令行参数在该数组中以脚本名称开头。您可以使用$_SERVER['argc']
在这个例子中
$_SERVER['argc'] = 2 $_SERVER['argv'][0] = auto.php $_SERVER['argv'][1] = myuser
奖励信息
你可以在php文件的第一行添加#!/usr/bin/php
(称为shebang),添加执行位,然后你不必在命令行上调用php就可以调用脚本。假设php位于/ usr / bin / php
答案 1 :(得分:2)
问号标记表示HTTP GET参数,该参数在终端上没有意义,因为不涉及Web服务器。你可以用这个:
cd /var/www; php auto.php some parameters
然后在PHP脚本中使用$_SERVER['argc']
和$_SERVER['argv']
来读取参数。
答案 2 :(得分:2)
您无法使用url-style参数从命令行调用php脚本,但有几种可能的解决方案:
您可以使用wget通过网络服务器有效地触发脚本(假设它实际上是在服务器中运行的页面/脚本)
0 1 * * * wget http://yourserver/thepath/auto.php?user=user
使用php的getopt扩展名修改脚本以接受shell样式参数
$options = getopt("u:"); // expect -u followed by the parameter value
$user = $options["u"];
// continue the script
被称为
php -q auto.php -u user
查看getopt文档页面,你可以使它比它更加漂亮。使用getopt而不是使用argc / argv(它仍然是一个有效的选项btw)的主要优点是,处理可以按任何顺序给出的多个参数要容易得多。例如,假设您需要:
php -q auto.php -u user -p pass -a another -b whatever
你需要写一些支持代码来解析这些参数,而getopt本身就是这样做的。
答案 3 :(得分:1)
你不能这样做 - 这是在http请求中传递参数的方式,而不是在任何地方。对于命令行,您必须使用$_SERVER['argv']
和$_SERVER['argc']
。
在你的情况下,你应该稍微修改你的代码。代替
$user = $_GET['user'];
使用
$user = $_SERVER['argv'][1];
并且应该将您调用脚本的方式更改为:
0 1 * * * cd /var/www; php auto.php user
您也可以找到一些有用的命令行帮助程序类,即:CLI
有关详细信息,请参阅PHP手册中的Command Line Usage部分。