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.
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.
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;
}
}
Che cos'è questa cosa dl()? Non è davvero necessario vero? Inoltre, cosa succede se il codice è in esecuzione su Windows, no * .so * lì giusto? –
'dl' è per caricare l'estensione in fase di esecuzione – bitWorking
OK. Non mi piace molto. –
Hai guardato get_extension_funcs?
No, non ne ero a conoscenza. È interessante notare che sembra funzionare per xdebug, ma non per redis né v8js. –
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
}
Perché il backslash sul nome della classe? –
Per gli spazi dei nomi, se il proprio in un ambiente dei domini – Ascherer
Interessante. Non lo sapevo. –
get_loaded_extensions si adatta al conto.
Usa come questo:
$ext_loaded = in_array('redis', get_loaded_extensions(), true);
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
@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. –
molto vero :) non potrei essere più d'accordo – Ascherer
che dire [extension_loaded] (http://php.net/manual/de/function.extension-loaded.php)? – bitWorking
@redreggae, che ne pensi di scriverlo come risposta? :) –
può anche utilizzare la classe ReflectionExtension. Aggiunto alla mia risposta – Ascherer