php popen()选择了空格吗?

时间:2011-07-17 12:06:47

标签: php

我有这段代码:

            $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

中完成的

1 个答案:

答案 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()通常是一种好习惯,因为它会为你引用参数。

相关问题