2015-03-24 16 views
11

Natknąłem się na dziwne zachowanie funkcji php function_exists() w PHP 5.6. Chodzi o to, że jeśli podam parametr nazwy funkcji bezpośrednio jako łańcuch, wynik jest inny, niż podany jako zmienna. Oto kod:PHP 5.6 function_exists dziwne zachowanie z OPCache

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

echo phpversion() . "\n"; 
var_dump($r1); 
var_dump($r2); 

i oto wynik:

5.6.5 
bool(true) # $r1=function_exists('posix_getpwuid'); 
bool(false) # $r2=function_exists($f); 

Spodziewam się, że powinno być fałszywy w obu przypadkach.

Podczas kopania głębiej odkryłem, że ma to coś wspólnego z OPCache. Gdy OPCache jest wyłączony, wyniki są w porządku - oba wywołania zwracają fałsz. Ale przy włączonym OPCache, w pierwszym uruchomieniu nadal jest OK, ale w drugim uruchomieniu (więc gdy wynik jest buforowany), wynik jest błędny.

Funkcja posix_getpwuid jest wyłączone w konfiguracji PHP w disable_functions. W przypadku testowania z nieistniejącą nazwą funkcji wyniki są poprawne.

Podczas testowania w PHP 5.5.21, wyniki są w porządku (z OPCache lub bez).

Używanie Zend OPcache v7.0.4-dev w PHP 5,5 i 5,6.

Zastanawiam się nad zgłoszeniem błędu programistom PHP, chciałem tylko upewnić się, że czegoś nie brakuje.

Dzięki.

edycja: Testowane również ze świeżo skompilowanymi PHP 5.6.6 i 5.6.7. System operacyjny jest w pełni zaktualizowany CentOS 6.6. Wyniki są takie same dla 5.6.6 lub 5.6.7.

PHP zbudowany bez możliwości produkcji:

./configure \ 
    --prefix=/usr/local/php/5.6.7-test 

z naprawdę proste 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 

skrypt testowy:

<? 
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']); 

i wynik - pierwszy bieg i poprawny wynik:

# /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) 

sekund run - podawane przez OPCache, wynik jest zły:

# /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) 

(Teraz nie jestem pewien dlaczego, ale gdy są wykonywane tylko php, OPCache zrobił zacząć, więc użyłem php-cgi)

+0

Normalne wyjście w 5.6.6 Nie widzisz niczego na poprawkę w dzienniku zmian – tlenss

+0

Czy testowałeś to za pomocą OPCache? Która wersja? Dla mnie to wciąż to samo .. – dave

+0

Przerekrutowałem z opcache. Ale wciąż mam oczekiwane rezultaty (PHP 5.6.5, Zend OPcache v7.0.4-dev). Uwaga: jest to testowane tylko w wersji CLI. – tlenss

Odpowiedz