1

我目前正在为几个人运行 cronjobs,要知道这些人是谁,我给它一个包含一些细节的参数:

0 1 * * * cd /var/www; php auto.php?user=user

由于某种原因,它返回此结果:

无法打开输入文件:auto.php?user=user

语法有什么问题吗?我必须编码任何东西吗?

4

4 回答 4

7

在命令行 PHP 中使用参数是不同的

命令应该是

php auto.php myuser

然后在脚本中使用$_SERVER['argv']超全局数组访问变量 - 每个命令行参数在该数组中以脚本名称开头的顺序排列。您可以检查传递的参数数量$_SERVER['argc']

在这种情况下

$_SERVER['argc'] = 2
$_SERVER['argv'][0] = auto.php
$_SERVER['argv'][1] = myuser

奖金信息

您可以#!/usr/bin/php在 php 文件的第一行添加一个(称为 shebang),添加执行位,然后您不必在命令行上调用 php,您只需调用脚本即可。假设 php 位于 /usr/bin/php 的典型位置

于 2012-10-07T09:12:50.453 回答
2

您不能使用 url 样式参数从命令行调用 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 文档页面,你也可以让它比这更精彩。与使用 argc/argv 相比,使用 getopt 的主要优点(顺便说一句,这仍然是一个有效的选项)是处理可以以任何顺序给出的多个参数要容易得多。例如,假设您需要:

php -q auto.php -u user -p pass -a another -b whatever

您将需要编写相当多的支持代码来解析这些参数,而 getopt 自己完成了这一切。

于 2012-10-07T09:14:15.000 回答
2

你不能那样做——这是在 http 请求中传递参数的方式,而不是到处。对于命令行,您必须使用$_SERVER['argv']and $_SERVER['argc']

在你的情况下,你应该修改你的代码。代替

$user = $_GET['user'];

利用

$user = $_SERVER['argv'][1];

并且应该将调用脚本的方式更改为:

0 1 * * * cd /var/www; php auto.php user

您还可以找到一些有用的命令行帮助程序类,即:CLI

有关详细信息,请参阅PHP 手册中的命令行使用部分。

于 2012-10-07T09:17:39.907 回答
2

问号表示 HTTP GET 参数,在终端上没有意义,因为不涉及 Web 服务器。你可以使用这个:

cd /var/www; php auto.php some parameters

然后在 PHP 脚本中使用$_SERVER['argc']and来读取参数。$_SERVER['argv']

于 2012-10-07T09:10:49.290 回答