2013-05-17 16 views
7

Come faccio dal codice PHP se un'estensione PECL è installata o no?Come verificare se l'estensione PECL è presente?

Desidero gestire con garbo il caso quando un'estensione non è installata.

+0

che dire [extension_loaded] (http://php.net/manual/de/function.extension-loaded.php)? – bitWorking

+0

@redreggae, che ne pensi di scriverlo come risposta? :) –

+0

può anche utilizzare la classe ReflectionExtension. Aggiunto alla mia risposta – Ascherer

risposta

7

Penso che il modo normale sarebbe quella di utilizzare extension-loaded.

if (!extension_loaded('gd')) { 
    // If you want to try load the extension at runtime, use this code: 
    if (!dl('gd.so')) { 
     exit; 
    } 
} 
+0

Che cos'è questa cosa dl()? Non è davvero necessario vero? Inoltre, cosa succede se il codice è in esecuzione su Windows, no * .so * lì giusto? –

+0

'dl' è per caricare l'estensione in fase di esecuzione – bitWorking

+2

OK. Non mi piace molto. –

4

Hai guardato get_extension_funcs?

+0

No, non ne ero a conoscenza. È interessante notare che sembra funzionare per xdebug, ma non per redis né v8js. –

2

Coppia modi diversi. Si può solo verificare l'esistenza della classe, o anche di una funzione: class_exists, function_exists, e get_extension_funcs:

<?php 
if(class_exists('\Memcached')) { 
    // Memcached class is installed 
} 

// I cant think of an example for `function_exists`, but same idea as above 

if(get_extension_funcs('memcached') === false) { 
    // Memcached isn't installed 
} 

È inoltre possibile ottenere super complicato, e utilizzare ReflectionExtension. Quando lo costruisci, genererà un ReflectionException. Se non genera un'eccezione, puoi provare altre cose sull'estensione (come la versione).

<?php 
try { 
    $extension = new \ReflectionExtension('memcached'); 
} catch(\ReflectionException $e) { 
    // Extension Not loaded 
} 

if($extension->getVersion() < 2) { 
    // Extension is at least version 2 
} else { 
    // Extension is only version 1 
} 
+0

Perché il backslash sul nome della classe? –

+1

Per gli spazi dei nomi, se il proprio in un ambiente dei domini – Ascherer

+0

Interessante. Non lo sapevo. –

5

get_loaded_extensions si adatta al conto.

Usa come questo:

$ext_loaded = in_array('redis', get_loaded_extensions(), true); 
+0

strano che questo avrebbe funzionato per te quando 'get_extension_funcs' wouldnt. Per la cronaca, usare 'class_exists' è di solito la norma per fare cose come questa, ma questo per mostrarmi in un altro modo :) – Ascherer

+2

@Ascherer, sì, suppongo che * class_exists * sia più elegante, dal momento che non interessa ai dettagli di implementazione. Penso che lo userò nel mio codice di produzione. Tuttavia, è bene sapere come controllare le estensioni. Penso che get_extension_funcs non ha funzionato perché redis espone solo una classe, nessuna funzione. –

+0

molto vero :) non potrei essere più d'accordo – Ascherer

Problemi correlati