将variables传递给从命令行运行的php脚本
我有一个PHP文件需要从命令行(通过crontab)运行。 我需要将type=daily
传递给文件,但我不知道如何。 我试过了:
php myfile.php?type=daily
但是这个错误被返回:
无法打开input文件:myfile.php?type = daily
我能做什么?
?type=daily
参数(以$_GET
数组结尾)仅对Web访问的页面有效。
你需要php myfile.php daily
调用它像php myfile.php daily
并从$argv
数组(这将是$argv[1]
,因为$argv[0]
将是myfile.php
)检索该参数。
如果该页面也用作网页,则可以考虑两个选项。 或者用shell脚本访问它,并从cron中调用它:
#!/bin/sh wget http://location.to/myfile.php?type=daily
或者检查php文件是否从命令行调用:
if (defined('STDIN')) { $type = $argv[1]; } else { $type = $_GET['type']; }
(注意:您可能需要/想要检查$argv
实际包含了足够的variables等)
只需将其作为普通parameter passing,并使用$argv
数组在PHP中进行访问。
php myfile.php daily
并在myfile.php
$type = $argv[1];
参数像其他应用程序一样由索引发送
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) == 0) exit; foreach ($a as $arg){ list($x,$y) = explode('=', $arg); $b["$x"] = $y; } ?>
如果你添加var_dump($b);
在?>
标签之前,你会看到数组$b
包含type => daily
。
这些行将CLI调用的参数,如php myfile.php "type=daily&foo=bar"
转换为众所周知的$_GET
-array:
if (!empty($argv[1])) { parse_str($argv[1], $_GET); }
尽pipe覆盖全局的$_GET
数组相当麻烦,但它会快速转换所有脚本以接受CLI参数。
有关详细信息,请参阅http://php.net/manual/en/function.parse-str.php 。
<?php if (count($argv) == 0) exit; foreach ($argv as $arg) echo $arg; ?>
这个代码不应该被使用。 首先CLI调用如下:/ usr / bin / php phpscript.php将有一个argv值,它是脚本的名字
array(2) { [0]=> string(13) "phpscript.php" }
这个会一直执行,因为会有1或2个参数
我强烈build议使用getopt。
文档在http://php.net/manual/en/function.getopt.php
如果你想帮助打印出你的select,看看https://github.com/c9s/GetOptionKit#general-command-interface
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;
也可以直接使用
$$键= $ VAL
使用这样的:
myFile.php / key = val