我有这段代码:
$handle = popen("php -q nah.php -p=". '$part' . " 2>&1", "r");
while (!feof($handle))
{
$read = fread($handle, 2096);
echo $read;
}
pclose($handle);
nah.php看起来像这样:
echo "yaya1\n";
$options = getopt("p:");
$part = $options["p"];
echo $part;
print_r($options);
这个的输出结果是:
yaya1阵列( [p] => )
虽然主文件中的$部分包含内容。 它可能是什么错误? 我该如何修复错误? 谢谢 所有这些都是在php-cli
中完成的答案 0 :(得分:2)
您需要将运行popen
的行替换为:
$handle = popen("php -q nah.php -p=". escapeshellarg($part) . " 2>&1", "r");
这会使用escapeshellarg()
[docs] 函数来包装$part
变量引号(并转义其中的任何引号),以便它可以安全地用作shell参数。
错误是您在单引号中有$part
,因此它直接以$part
的形式发送到shell,而不是由PHP替换的值。然后shell尝试查找名为$part
的 shell 变量来替换它,但由于没有,它只是用空格替换它。
此代码也有效:
$handle = popen("php -q nah.php -p=". $part . " 2>&1", "r");
但是,这不会将变量包装在单引号中,所以如果其中有任何空格,只有第一个单词被认为是参数p
的值,所有其他单词都会被认为是考虑了不同的论点。
在向shell命令发送参数时使用escapeshellarg()
通常是一种好习惯,因为它会为你引用参数。