2015-03-24 35 views
11

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)

+0

Uscita normale in 5.6.6 Non si vede nulla di una correzione nel registro modifiche – tlenss

+0

L'hai testato con OPCache? Quale versione? Per me è sempre lo stesso .. – dave

+0

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

risposta