Mi sono imbattuto in uno strano comportamento della funzione php function_exists() in PHP 5.6. Il fatto è che, se fornisco direttamente il parametro nome funzione come stringa, il risultato è diverso da quando fornito come variabile. Ecco il codice:PHP 5.6 function_exists comportamento strano con OPCache
$f='posix_getpwuid';
$r1=function_exists('posix_getpwuid');
$r2=function_exists($f);
echo phpversion() . "\n";
var_dump($r1);
var_dump($r2);
ed ecco il risultato:
5.6.5
bool(true) # $r1=function_exists('posix_getpwuid');
bool(false) # $r2=function_exists($f);
mi si aspetterebbe, che dovrebbe essere falsa in entrambi i casi.
Quando ho scavato più a fondo, ho scoperto che ha qualcosa a che fare con OPCache. Quando OPCache è disabilitato, i risultati vanno bene - entrambe le chiamate restituiscono false. Ma con OPCache abilitato, nella prima esecuzione è ancora OK ma nella seconda esecuzione (quindi quando viene fornito il risultato memorizzato nella cache), il risultato è sbagliato.
Funzione posix_getpwuid è disattivato in configurazione di PHP in disable_functions. Se testato con un nome di funzione inesistente, i risultati sono corretti.
Quando si esegue il test in PHP 5.5.21, i risultati vanno bene (con o senza OPCache).
Utilizzo di Zend OPcache v7.0.4-dev in entrambi i 5.5 e 5.6 di PHP.
Sto pensando di inviare un bug agli sviluppatori PHP, volevo solo essere sicuro di non mancare qualcosa.
Grazie.
modifica: Testati anche con PHP 5.6.6 e 5.6.7 appena compilati. Il sistema operativo è completamente aggiornato CentOS 6.6. I risultati sono gli stessi per 5.6.6 o 5.6.7.
PHP costruito senza alcuna opzione di compilazione:
./configure \
--prefix=/usr/local/php/5.6.7-test
con semplici php.ini davvero
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
script di test:
<?
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']);
e il risultato - prima esecuzione e risultato corretto:
# /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)
secondo run - servito da OPCache, risultato è pessimo:
# /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)
(Ora io non so perché, ma quando eseguito con solo php
, OPCache non ha ancora iniziare, quindi ho usato php-cgi
)
Uscita normale in 5.6.6 Non si vede nulla di una correzione nel registro modifiche – tlenss
L'hai testato con OPCache? Quale versione? Per me è sempre lo stesso .. – dave
Ho ricompilato con opcache. Ma ho ancora i risultati attesi (PHP 5.6.5, Zend OPcache v7.0.4-dev). Nota: questo è testato solo nella versione CLI. – tlenss