我想使用exec调用php文件。
当我调用它时,我希望能够通过(id)传递变量。
我可以很好地调用echo exec("php /var/www/unity/src/emailer.php");
,但是当我添加echo exec("php /var/www/unity/src/emailer.php?id=123");
之类的内容时,exec调用会失败。
我该怎么做?
答案 0 :(得分:27)
您的调用失败,因为您使用带有命令行调用的Web样式语法(?parameter=value
)。我理解你在想什么,但它根本行不通。
您需要使用$argv
代替。请参阅the PHP manual。
要查看此操作,请将此单行内容写入文件:
<?php print_r($argv); ?>
然后使用参数从命令行调用它:
php -f /path/to/the/file.php firstparam secondparam
您会看到$argv
包含脚本本身的名称为元素零,后跟您传入的其他参数。
答案 1 :(得分:2)
在您的脚本中尝试echo exec("php /var/www/unity/src/emailer.php 123");
,然后阅读commandline parameters。
答案 2 :(得分:2)
这个改编的脚本显示了两种从php exec命令传递参数到php脚本的方法: 打电话给
<?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";
?>
CALLED 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)。
RESULT
argv params:Array
(
[0] => /var/www/ztest/helloworld.php
[1] => 12
[2] => target=13
)
大小合适,wilburargv元素1:12
选择您希望传递参数的任何解决方案,您只需访问argv数组并按照它们传递的顺序检索它们(文件名是0元素)。
tks @hakre
答案 3 :(得分:1)
如果要向其传递GET参数,则必须为调用提供 php-cgi 二进制文件:
exec("QUERY_STRING=id=123 php-cgi /var/www/emailer.php");
但这可能需要更多假的CGI环境变量。因此,为什么通常建议重写被调用的脚本并让它采用正常的命令行参数并通过$_SERVER["argv"]
读取它们。
(你也可以用普通的php解释器伪装php-cgi行为,上面的例子是在你的脚本之上添加parse_str($_SERVER["QUERY_STRING"], $_GET);
。)
答案 4 :(得分:1)
我知道这是一个旧线程,但它帮助我解决了一个问题,所以我想提供一个扩展的解决方案。我有一个通常通过 Web 界面调用的 php 程序,它需要一长串参数。我想通过使用 shell_exec() 的 cron 作业在后台运行它,并将一长串参数传递给它。每次运行时参数值都会发生变化。
这是我的解决方案:在调用程序中,我传递一串参数,这些参数看起来就像网络调用在 ? 之后发送的字符串。例如:sky=blue&roses=red&sun=bright 等。在被调用的程序中,我检查 $argv[1] 是否存在,如果找到,我将字符串解析为 $_GET 数组。从那时起,程序读取参数就像从网络调用中传递过来一样。
调用程序代码:
np.where()
在读取 $_GET 参数之前插入的调用程序代码:
$pars = escapeshellarg($pars); // must use escapeshellarg()
$output = shell_exec($php_path . ' path/called_program.php ' . $pars); // $pars is the parameter string
效果很好,只需对被调用程序进行最少的更改。希望有人觉得它有价值。