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
)
Normalne wyjście w 5.6.6 Nie widzisz niczego na poprawkę w dzienniku zmian – tlenss
Czy testowałeś to za pomocą OPCache? Która wersja? Dla mnie to wciąż to samo .. – dave
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