小编dav*_*ave的帖子

PHP 5.6 function_exists与OPCache存在奇怪的行为

我在PHP 5.6中偶然发现了php函数function_exists()的奇怪行为.问题是,如果我直接将函数名称参数作为字符串提供,则结果与作为变量提供的结果不同.这是代码:

$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);

echo phpversion() . "\n";
var_dump($r1);
var_dump($r2);
Run Code Online (Sandbox Code Playgroud)

这是结果:

5.6.5
bool(true)    # $r1=function_exists('posix_getpwuid');
bool(false)   # $r2=function_exists($f);
Run Code Online (Sandbox Code Playgroud)

我希望,在这两种情况下都应该是假的.

当我深入挖掘时,我发现它与OPCache有关.禁用OPCache时,结果很好 - 两个调用都返回false.但是启用了OPCache,在第一次运行时它仍然可以,但在第二次运行时(所以当提供缓存结果时),结果是错误的.

函数posix_getpwuiddisable_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进行测试.操作系统完全更新了CentOS 6.6.5.6.6或5.6.7的结果相同.

PHP构建时没有任何构建选项:

./configure \
    --prefix=/usr/local/php/5.6.7-test
Run Code Online (Sandbox Code Playgroud)

与真正简单的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
Run Code Online (Sandbox Code Playgroud)

测试脚本:

<?
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 …
Run Code Online (Sandbox Code Playgroud)

php opcache php-5.6

11
推荐指数
1
解决办法
501
查看次数

标签 统计

opcache ×1

php ×1

php-5.6 ×1