[英]calling exec on a php file and passing parameters?
我想使用exec调用 php 文件。
当我调用它时,我希望能够通过(一个id)传递一个变量。
我可以调用echo exec("php /var/www/unity/src/emailer.php");
很好,但是当我添加类似echo exec("php /var/www/unity/src/emailer.php?id=123");
exec 调用失败。
我怎样才能做到这一点?
您的呼叫失败,因为您使用的是带有命令行调用的 web 样式语法 ( ?parameter=value
)。 我明白你在想什么,但它根本行不通。
你会想要使用$argv
来代替。 请参阅PHP 手册。
要查看实际情况,请将此单行代码写入文件:
<?php print_r($argv); ?>
然后使用 arguments 从命令行调用它:
php -f /path/to/the/file.php firstparam secondparam
您将看到$argv
包含脚本本身的名称作为元素零,后跟您传入的任何其他参数。
这个改编的脚本显示了从 php exec 命令将参数传递给 php 脚本的 2 种方法:CALLING SCRIPT
<?php
$fileName = '/var/www/ztest/helloworld.php 12';
$options = 'target=13';
exec ("/usr/bin/php -f {$fileName} {$options} > /var/www/ztest/log01.txt 2>&1 &");
echo "ended the calling script";
?>
调用脚本
<?php
echo "argv params: ";
print_r($argv);
if ($argv[1]) {echo "got the size right, wilbur! argv element 1: ".$argv[1];}
?>
不要忘记验证执行权限并创建具有写入权限的 log01.txt 文件(您的 apache 用户通常是 www-data)。
结果
argv 参数:数组
(
[0] => /var/www/ztest/helloworld.php
[1] => 12
[2] => target=13
)
尺寸合适,wilburargv 元素 1:12
选择您喜欢的任何解决方案来传递参数,您需要做的就是访问 argv 数组并按照传递的顺序检索它们(文件名是 0 元素)。
谢谢@hakre
试试echo exec("php /var/www/unity/src/emailer.php 123");
然后在你的脚本中读入命令行参数。
如果您想向其传递 GET 参数,则必须提供php-cgi二进制文件以供调用:
exec("QUERY_STRING=id=123 php-cgi /var/www/emailer.php");
但这可能需要更多虚假的 CGI 环境变量。 因此,通常建议重写被调用的脚本并让它使用正常的命令行 arguments 并通过$_SERVER["argv"]
读取它们。
(您也可以通过在脚本顶部添加parse_str($_SERVER["QUERY_STRING"], $_GET);
来使用普通的 php 解释器和上面的示例来伪造 php-cgi 行为。)
我知道这是一个旧线程,但它帮助我解决了一个问题,所以我想提供一个扩展的解决方案。 我有一个 php 程序,该程序通常通过 web 接口调用,并获取一长串参数。 我想使用 shell_exec() 在后台使用 cron 作业运行它,并将一长串参数传递给它。 每次运行时参数值都会发生变化。
这是我的解决方案:在调用程序中,我传递了一串参数,这些参数看起来就像 web 调用将在?之后发送的字符串。 例如:sky=blue&roses=red&sun=bright 等。在被调用的程序中,我检查 $argv[1] 的存在,如果找到,我将字符串解析到 $_GET 数组中。 从那时起,程序读取参数,就好像它们是从 web 调用中传递的一样。
调用程序代码:
$pars = escapeshellarg($pars); // must use escapeshellarg()
$output = shell_exec($php_path . ' path/called_program.php ' . $pars); // $pars is the parameter string
在读取 $_GET 参数之前插入的调用程序代码:
if(isset($argv[1])){ // if being called from the shell build a $_GET array from the string passed as $argv[1]
$args = explode('&', $argv[1]); // explode the string into an array of Type=Value elements
foreach($args as $arg){
$TV = explode('=', $arg); // now explode each Type and Value into a 2 element array
$_GET[$TV[0]] = $TV[1]; // set the indexes in the $_GET array
}
}
//------------------------
// from this point on the program processes the $_GET array normally just as if it were passed from a web call.
效果很好,并且需要对被调用程序进行最少的更改。 希望有人发现它的价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.