我有一个PHP文件,需要从命令行运行(通过crontab)。我需要传递type=daily
给文件,但我不知道如何。我试过了:
php myfile.php?type=daily
但返回此错误:
无法打开输入文件:myfile.php?type = daily
我能做什么?
Answers:
该?type=daily
参数(在结束了$_GET
阵列)仅适用于网络访问的页面。
您需要像调用它一样,php myfile.php daily
并从$argv
数组中检索该参数(为$argv[1]
,因为$argv[0]
为myfile.php
)。
如果该页面也用作网页,则可以考虑两个选项。使用shell脚本和wget访问它,然后从cron调用它:
#!/bin/sh
wget http://location.to/myfile.php?type=daily
或检查php文件是否从命令行调用:
if (defined('STDIN')) {
$type = $argv[1];
} else {
$type = $_GET['type'];
}
(注意:您可能需要/想要检查$argv
实际上是否包含足够的变量等)
只需将其作为常规参数传递,然后使用$argv
数组在PHP中访问即可。
php myfile.php daily
并在myfile.php中
$type = $argv[1];
这些行会将CLI调用的参数转换为php myfile.php "type=daily&foo=bar"
众所周知的$_GET
-array:
if (!empty($argv[1])) {
parse_str($argv[1], $_GET);
}
尽管覆盖global $_GET
-array很麻烦,但是它会快速转换所有脚本以接受CLI参数。
使用getopt()函数,我们还可以从命令行读取参数,只需使用php running命令传递值
PHP abc.php --name = xyz
abc.php
$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];
像其他应用程序一样通过索引发送参数
php myfile.php type=daily
然后你可以像这样盖住他们
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>
将此代码保存在文件中myfile.php
并以php myfile.php type=daily
<?php
$a = $argv;
$b = array();
if (count($a) === 1) exit;
foreach ($a as $key => $arg) {
if ($key > 0) {
list($x,$y) = explode('=', $arg);
$b["$x"] = $y;
}
}
?>
如果var_dump($b);
在?>
标记之前添加,则会看到该数组$b
包含type => daily
。
我强烈建议使用getopt。
http://php.net/manual/zh/function.getopt.php上的文档
如果您想打印出帮助的选项,而不是看看https://github.com/c9s/GetOptionKit#general-command-interface
<?php
parse_str(implode('&', array_slice($argv, 1)), $_GET);
?>
它的行为与您对cgi-php的期望完全相同。
$ php -f myfile.php type=daily a=1 b[]=2 b[]=3
将设置$_GET['type']
到'daily'
,$_GET['a']
到'1'
和$_GET['b']
到array('2', '3')
。
有4种主要选择,两者都有其独特之处,我认为方法4有许多优点。
./script
是一个shell脚本,从#!/usr/bin/php
方法1: $ argv
./script hello wo8844rld
// $argv[0] = "script", $argv[1] = "hello", $argv[2] = "wo8844rld"
$️使用$ argv,参数顺序至关重要。
方法2: getopt()
./script -p7 -e3
// getopt("p::")["p"] = "7", getopt("e::")["e"] = "3"
很难与结合使用$argv
,因为:
options️选项的解析将在找到的第一个非选项处结束,其后的所有内容都将被丢弃。
Only️只有26个params作为字母。
方法3: Bash全局变量
P9="xptdr" ./script
// getenv("P9") = "xptdr"
// $_SERVER["P9"] = "xptdr"
这些变量可以由在同一shell中运行的其他程序使用。
它们在关闭外壳时被吹掉,但是在php程序终止时不会被吹掉。我们可以将它们设置为永久~/.bashrc
!
方法4: STDIN管道和stream_get_contents()
一些管道示例:
输入一个字符串:
./script <<< "hello wo8844rld"
// stream_get_contents(STDIN) = "hello wo8844rld"
使用bash echo输入字符串:
echo "hello wo8844rld" | ./script
// explode(" ",stream_get_contents(STDIN)) ...
提要文件内容:
./script < ~/folder/Special_params.txt
// explode("\n",stream_get_contents(STDIN)) ...
输入一个值数组:
./script <<< '["array entry","lol"]'
// var_dump( json_decode(trim(stream_get_contents(STDIN))) );
从文件中输入json:
echo params.json | ./script
// json_decode(stream_get_contents(STDIN)) ...
通过读取STDIN,它可能与fread()或fgets()类似。
if (isset($argv) && is_array($argv)) {
$param = array();
for ($x=1; $x<sizeof($argv);$x++) {
$pattern = '#\/(.+)=(.+)#i';
if (preg_match($pattern, $argv[$x])) {
$key = preg_replace($pattern, '$1', $argv[$x]);
$val = preg_replace($pattern, '$2', $argv[$x]);
$_REQUEST[$key] = $val;
$$key = $val;
}
}
}
我将参数放在$ _REQUEST中
$ _REQUEST [$ key] = $ val;
也可以直接使用
$$ key = $ val
这样使用:
myFile.php / key = val