PHP 5.6 function_exists OPCache 的奇怪行为
PHP 5.6 function_exists strange behavior with OPCache
我偶然发现 php 函数 function_exists() 在 PHP 5.6[=59= 中的奇怪行为].问题是,如果我直接将函数名称参数作为字符串提供,结果将不同于作为变量提供的结果。这是代码:
$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);
echo phpversion() . "\n";
var_dump($r1);
var_dump($r2);
结果如下:
5.6.5
bool(true) # $r1=function_exists('posix_getpwuid');
bool(false) # $r2=function_exists($f);
我希望在这两种情况下它都应该是 false。
深入挖掘后,我发现它与OPCache有关。当禁用 OPCache 时,结果很好 - 两个调用 returns false。但是在启用 OPCache 的情况下,在第一个 运行 中它仍然可以,但在第二个 运行 中(因此当提供缓存结果时),结果是错误的。
功能 posix_getpwuid 在 disable_functions 的 PHP 配置中被禁用。当使用不存在的函数名称进行测试时,结果是正确的。
在 PHP 5.5.21 中测试时,结果很好(有或没有 OPCache)。
在 PHP 5.5 和 5.6 中使用 Zend OPcache v7.0.4-dev。
我正在考虑向 PHP 开发人员提交错误,只是想确保我没有遗漏任何东西。
谢谢。
编辑:
还使用新编译的 PHP 5.6.6 和 5.6.7 进行了测试。 OS 已完全更新 CentOS 6.6。 5.6.6 或 5.6.7 的结果相同。
PHP 在没有任何构建选项的情况下构建:
./configure \
--prefix=/usr/local/php/5.6.7-test
非常简单php.ini
disable_functions = posix_getpwuid
date.timezone = Europe/Prague
zend_extension=/usr/local/php/5.6.7-test/lib/php/extensions/no-debug-non-zts-20131226/opcache.so
测试脚本:
<?
echo phpversion() . "\n";
$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);
echo "\n\n";
echo "string: ";
var_dump ($r1);
echo "var. : ";
var_dump ($r2);
echo "opcache status: ";
var_dump(opcache_get_status()['opcache_enabled']);
和结果 - 第一个 运行 和正确的结果:
# /usr/local/php/php-TEST/bin/php-cgi -c /data/web/php-test/ fce.php
X-Powered-By: PHP/5.6.7
Content-type: text/html; charset=UTF-8
5.6.7
string: bool(false)
var. : bool(false)
opcache status: bool(true)
second 运行 - 由 OPCache 服务,结果不好:
# /usr/local/php/php-TEST/bin/php-cgi -c /data/web/php-test/ fce.php
X-Powered-By: PHP/5.6.7
Content-type: text/html; charset=UTF-8
5.6.7
string: bool(true)
var. : bool(false)
opcache status: bool(true)
(现在我不确定为什么,但是当仅使用 php
执行时,OPCache 没有启动,所以我使用 php-cgi
)
我在 PHP 中报告了一个错误
https://bugs.php.net/bug.php?id=69297
5.6.8 现已修复。
http://git.php.net/?p=php-src.git;a=commit;h=d380d1cb1ba48c41682f749692b78a10e91dd070
我测试了这个补丁,它工作正常。
感谢@tlenss 和我一起测试。
我偶然发现 php 函数 function_exists() 在 PHP 5.6[=59= 中的奇怪行为].问题是,如果我直接将函数名称参数作为字符串提供,结果将不同于作为变量提供的结果。这是代码:
$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);
echo phpversion() . "\n";
var_dump($r1);
var_dump($r2);
结果如下:
5.6.5
bool(true) # $r1=function_exists('posix_getpwuid');
bool(false) # $r2=function_exists($f);
我希望在这两种情况下它都应该是 false。
深入挖掘后,我发现它与OPCache有关。当禁用 OPCache 时,结果很好 - 两个调用 returns false。但是在启用 OPCache 的情况下,在第一个 运行 中它仍然可以,但在第二个 运行 中(因此当提供缓存结果时),结果是错误的。
功能 posix_getpwuid 在 disable_functions 的 PHP 配置中被禁用。当使用不存在的函数名称进行测试时,结果是正确的。
在 PHP 5.5.21 中测试时,结果很好(有或没有 OPCache)。
在 PHP 5.5 和 5.6 中使用 Zend OPcache v7.0.4-dev。
我正在考虑向 PHP 开发人员提交错误,只是想确保我没有遗漏任何东西。
谢谢。
编辑: 还使用新编译的 PHP 5.6.6 和 5.6.7 进行了测试。 OS 已完全更新 CentOS 6.6。 5.6.6 或 5.6.7 的结果相同。
PHP 在没有任何构建选项的情况下构建:
./configure \
--prefix=/usr/local/php/5.6.7-test
非常简单php.ini
disable_functions = posix_getpwuid
date.timezone = Europe/Prague
zend_extension=/usr/local/php/5.6.7-test/lib/php/extensions/no-debug-non-zts-20131226/opcache.so
测试脚本:
<?
echo phpversion() . "\n";
$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);
echo "\n\n";
echo "string: ";
var_dump ($r1);
echo "var. : ";
var_dump ($r2);
echo "opcache status: ";
var_dump(opcache_get_status()['opcache_enabled']);
和结果 - 第一个 运行 和正确的结果:
# /usr/local/php/php-TEST/bin/php-cgi -c /data/web/php-test/ fce.php
X-Powered-By: PHP/5.6.7
Content-type: text/html; charset=UTF-8
5.6.7
string: bool(false)
var. : bool(false)
opcache status: bool(true)
second 运行 - 由 OPCache 服务,结果不好:
# /usr/local/php/php-TEST/bin/php-cgi -c /data/web/php-test/ fce.php
X-Powered-By: PHP/5.6.7
Content-type: text/html; charset=UTF-8
5.6.7
string: bool(true)
var. : bool(false)
opcache status: bool(true)
(现在我不确定为什么,但是当仅使用 php
执行时,OPCache 没有启动,所以我使用 php-cgi
)
我在 PHP 中报告了一个错误 https://bugs.php.net/bug.php?id=69297
5.6.8 现已修复。 http://git.php.net/?p=php-src.git;a=commit;h=d380d1cb1ba48c41682f749692b78a10e91dd070
我测试了这个补丁,它工作正常。
感谢@tlenss 和我一起测试。