PHP5.4“;解析“u str”;出人意料的行为

PHP5.4“;解析“u str”;出人意料的行为,php,php-5.4,Php,Php 5.4,我正在使用Zend Framework 2的AbstractRestfulController在我们的项目中实现CRUDAPI。使用PUT-HTTP方法调用更新现有实体的逻辑 当接收PUT请求时,AbstractRestfulController使用PHP的parse_str函数将请求主体转换为数组,但该函数不执行它应该执行的操作 因为它给了我奇怪的结果,所以我尝试使用PHP文档中提供的示例数据进行parse_str: // sample data from the PHP docs $cont

我正在使用Zend Framework 2的
AbstractRestfulController
在我们的项目中实现CRUDAPI。使用PUT-HTTP方法调用更新现有实体的逻辑

当接收PUT请求时,
AbstractRestfulController
使用PHP的
parse_str
函数将请求主体转换为数组,但该函数不执行它应该执行的操作

因为它给了我奇怪的结果,所以我尝试使用PHP文档中提供的示例数据进行
parse_str

// sample data from the PHP docs
$content = "first=value&arr[]=foo+bar&arr[]=baz";

// put the parsed variables into $parsedParams
parse_str($content, $parsedParams);
var_dump
ing
$parsedParams
提供了以下信息

array(5) { 
    ["first"]=> string(1) "v" 
    ["lue"]=> string(0) "" 
    ["rr"]=> array(2) { 
        [0]=> string(5) "foo b" 
        [1]=> string(1) "b" 
    } 
    ["r"]=> string(0) "" 
    ["z"]=> string(0) "" 
} 
显然,字符“a”混淆了
parse_str
,但我完全不知道是什么导致了这种奇怪的行为。PHP文件的编码是UTF-8,服务器在Vagrant环境中运行Ubuntu14.04和PHP5.4,作为Apache2.4模块

这可能是什么原因?我阅读了有关HTML实体
的问题&
而不是普通的
&
,但这似乎不适用于这里

更新

我只是通过
SSH
ing以交互模式在命令行上运行了相同的代码,并将其插入到流浪者机器中。在交互模式下,
parse_str
工作正常!然后,我通过
$php/var/www/test.php
从命令行运行测试脚本,该脚本也正常工作。
这是Apache PHP模块或配置的问题吗?

注意字符串在
&
a
上是如何分割的

我认为配置设置被错误地设置为
“&;”
,而不是默认的
“&

可以在
php.ini
.htaccess
httpd.conf
.user.ini
中设置此设置。请参阅:

测试程序:

<?php

  echo "arg_separator.input = '", ini_get ('arg_separator.input'), "'\n";

  $content = "first=value&arr[]=foo+bar&arr[]=baz";
  parse_str($content, $parsedParams);

  var_dump ($parsedParams);
arg_separator.input = '&'
array(2) {
  ["first"] => string(5) "value"
  ["arr"] => array(2) {
    [0] => string(7) "foo bar"
    [1] => string(3) "baz"
  }
}
<?php

  echo "arg_separator.output = '", ini_get ('arg_separator.output'), "'\n";

  $q = http_build_query (array ('a' => 0, 'b' => 1, 'c' => 2));
  echo $q, "\n";
arg_separator.output = '&'
a=0&b=1&c=2

配置设置也默认为
“&”
。如果您只生成HTML输出,那么将其设置为
“&;”
就可以了。但是,如果您想使用生成HTTP
Location:
头,或者在HTML实体引用不合适的其他情况下,您将遇到麻烦

测试程序:

<?php

  echo "arg_separator.input = '", ini_get ('arg_separator.input'), "'\n";

  $content = "first=value&arr[]=foo+bar&arr[]=baz";
  parse_str($content, $parsedParams);

  var_dump ($parsedParams);
arg_separator.input = '&'
array(2) {
  ["first"] => string(5) "value"
  ["arr"] => array(2) {
    [0] => string(7) "foo bar"
    [1] => string(3) "baz"
  }
}
<?php

  echo "arg_separator.output = '", ini_get ('arg_separator.output'), "'\n";

  $q = http_build_query (array ('a' => 0, 'b' => 1, 'c' => 2));
  echo $q, "\n";
arg_separator.output = '&'
a=0&b=1&c=2

刚刚在PHPV5.4中试用过,它可以正常工作。也许您的字符串包含使PHP窒息的不可见字符?你能试试echo strlen($content)看看你得到了什么吗?复制一下你贴的。似乎finestrlen($content)给了我35的长度,这是正确的,可能是我的PHP版本有问题还是类似的问题?我现在在命令行的交互模式下尝试了与上面相同的代码,我已将我的发现添加到初始问题中。非常感谢,这是问题的根源!我花了好几年的时间才弄明白。在设置Vagrant环境时,我将php.ini从生产服务器(共享环境)复制到Vagrant机器,我想我也必须在生产服务器上注意这个问题。我可以安全地将arg_separator.output保留为“&;”吗?