2011-07-20 183 views
31

我需要通过shell执行一个带有参数的php文件。Shell参数运行/执行php脚本

这里是我会怎样运行PHP文件:

PHP -q的htdocs/file.php

我需要有参数 '秀' 进行传递,并且

PHP -q的htdocs/file.php?显示= SHOW_NAME

不起作用

如果有人可以向我解释执行什么命令来获取php文件以设置参数执行,它将不胜感激。如果不是,请尝试引导我正确的方向。

+0

比接受的更好的答案:使用“php-cgi”可执行文件而不是“php”。请参阅:http://stackoverflow.com/a/11965479/543738 –

回答

35

test.php的:

<?php 
print_r($argv); 
?> 

壳牌:

$ php -q test.php foo bar 
Array 
(
    [0] => test.php 
    [1] => foo 
    [2] => bar 
) 
+1

好的,所以我不能通过PHP中的$ _GET接收参数,但通过$ argv,谢谢。我花了一段时间才弄清楚。 –

2

除了其他答案(这是相当正确的),你也可以传递参数作为环境参数,如下所示:

FOO=42 BAR=quux php test.php 

然后他们将在超全球$_ENV中可用。

+0

当我输入该命令时,出现“FOO”错误。我在Windows上使用xampp的shell命令,这会改变什么吗? –

+0

它可能无法在Windows上运行,但它在大多数unix类型的shell上可以正常工作。 – troelskn

+0

我得到它的工作,我期待它被PHP的$ _GET []函数接收。我花了一段时间才意识到$ arvg拥有所有参数。谢谢。 –

0

如果您正在使用它从一个PHP文件,那么你可以使用POPEN()和做这样的事情:

$part = $show_name; //or whatever you want with spaces 

$handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r"); 

它使用escapeshellarg()函数,以用引号括的$part变量(并且可以跳过里面的任何引号),以便它可以安全地用作shell参数。

5

如果您有Web服务器(安装不只是PHP解释器,但LAMP/LNMP /等) - 只是试试这个

wget -O - -q -t 1 "http://mysite.com/file.php?show=show_name" >/dev/null 2>&1 

其中:

  • «-O - » - (信“O”,而不是零!)重定向 “下载HTML” 到stdout
  • «>的/ dev/null的2> & 1» - 将stdout & stderr输出到无处
  • «-q» - 安静wget的运行
  • «-t 1 » - 只是尝试连接(不喜欢默认20)

在PHP中的 “执行” 这将是水木清华这样的:

function exec_local_url($url) { 
    exec('/usr/bin/wget -O - -q -t 1 "http://'. $_SERVER['HTTP_HOST'] .'/' 
    . addslashes($url) . '" >/dev/null 2>&1' 
); 
} 

// ... 

exec_local_url("file.php?show=show_name"); 
exec_local_url("myframework/seo-readable/show/show_name"); 

所以,你不需要改变你的脚本来处理argc/argv,并且可以像通常那样使用$ _GET。

如果你想在后台运行的作业 - 请参见前。 Unix/Windows, Setup background process? from php code

我在我的cron作业中使用了wget的方法;希望能帮助到你。

+0

使用'wget'和'php'命令在使用'exec'运行作业时关于安全性或性能有没有区别? – Gixty

+0

我确定安全是一样的。性能 - 当然'wget'会比上面说的更慢,但非常方便。使用wget,请求会执行所有隐藏阶段或请求处理,如apache/nginx/lighttpd缓存,重写等。当直接调用'php'时,你会责怪如此复杂的解决方法,即它不适用于所有情况。无论如何,我认为你只需要把你目前的案例,你的大脑,基准测试工具,只是洗一个好! ;) – FlameStorm