Подтвердить что ты не робот

PHP 5.6 function_exists странное поведение с OPCache

Я наткнулся на странное поведение php-функции function_exists() в PHP 5.6. Дело в том, что, если я предоставляю параметр имени функции непосредственно как строку, результат отличается от того, когда предоставляется как переменная. Вот код:

$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 отключен, результаты будут точными - оба вызова возвращают false. Но с включенным OPCache, в первом запуске все еще ОК, но во втором запуске (поэтому, когда кешированный результат обслуживается), результат неправильный.

Функция posix_getpwuid отключена в конфигурации PHP в disable_functions. При тестировании с несуществующим именем функции результаты верны.

При тестировании в PHP 5.5.21 результаты в порядке (с OPCache или без него).

Использование Zend OPcache v7.0.4-dev в PHP 5.5 и 5.6.

Я думаю о том, чтобы представить ошибку разработчикам 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

с реально простым 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

test script:

<?
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)

второй запуск - обслуживается 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)

4b9b3361