【发布时间】:2015-12-08 20:57:52
【问题描述】:
我在 nginx 后面运行 php,带有 php-fpm 和 cron 任务到 php 二进制文件 (/usr/bin/php)。
我发现了一个不一致的地方 - 当我通过 php 二进制文件和 fpm 运行相同的脚本时,它会输出不同的结果。
注意这仅适用于 PHP7。在另一台服务器上我用 5.6 测试过,结果是一样的。
这是我发现的。以下脚本:
<?php
class Test {
public function test(){
$arr = (object) [
'children' => []
];
$arr->children[] = 1;
return $arr;
}
}
$o = new Test();
$o->test();
print_r( $o->test() );
保存到test.php。当我通过浏览器(php-fpm)运行它时,会产生:
stdClass Object
(
[children] => Array
(
[0] => 1
)
)
但是当我从 CLI 执行它时,结果是不同的:
[root@server1 web]# php -f test.php
stdClass Object
(
[children] => Array
(
[0] => 1
[1] => 1
)
)
没有(对象)强制转换就不会发生。另外,如果我用new stdClass() 实例化$arr,它就不会发生。
似乎$arr = (object) 被php7 的引擎保存在内存中。
可能是配置问题。有人遇到过或者可以解释一下吗?
谢谢。
【问题讨论】:
-
在 PHP7 发布之前存在一些缓存问题,可能与其中之一有关。是由于一些速度优化
-
而
which php指向/usr/bin/php,对吧? -
这看起来像一个错误,我建议在bugs.php.net报告它
-
能否请您更新您正在运行的 PHP7 版本?
-
是的,@Andrea,看起来它是在 rc2 中引入的,存在于黄金大师和 7.1 中。但是……只影响班级。 3v4l.org/PJR7m