2013-05-17 14 views
7

Jak zrobić z kodu PHP, jeśli zainstalowane jest rozszerzenie PECL?Jak sprawdzić, czy rozszerzenie PECL jest obecne?

Chcę sprawnie obsługiwać obudowę, gdy rozszerzenie nie jest zainstalowane.

+0

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

+0

@redreggae, a co ty napisałeś jako odpowiedź? :) –

+0

może również używać klasy ReflectionExtension. Dodano to do mojej odpowiedzi – Ascherer

Odpowiedz

7

myślę normalny sposób byłoby użyć 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

O czym jest ta funkcja dl()? Niezbyt konieczne, prawda? Co się stanie, jeśli kod będzie działał w systemie Windows, no * .so * nie ma racji? –

+0

'dl' służy do ładowania rozszerzenia w czasie wykonywania – bitWorking

+2

OK. Nie bardzo to lubię. –

4

Czy spojrzałeś na get_extension_funcs?

+0

Nie, nie wiedziałem o tym. Co ciekawe, wydaje się działać dla xdebug, ale nie dla redis ani v8js. –

2

Kilka różnych sposobów. można po prostu sprawdzić na istnienie klasy, a nawet funkcji: class_exists, function_exists i 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 
} 

Można również uzyskać bardzo skomplikowane i korzystania ReflectionExtension. Kiedy ją skonstruujesz, wyświetli się ReflectionException. Jeśli nie rzuci wyjątku, możesz przetestować inne rzeczy dotyczące rozszerzenia (takie jak wersja).

<?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

Dlaczego odwrotny ukośnik w nazwie klasy? –

+1

Dla przestrzeni nazw, jeśli jesteś w środowisku przestrzeni nazw – Ascherer

+0

Interesujące. Nie wiedziałem o tym. –

5

get_loaded_extensions pasuje do rachunku.

Zastosowanie tak:

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

dziwne, że to będzie działać dla ciebie, gdy 'get_extension_funcs' nie będzie. Dla zapisu użycie 'class_exists' jest zwykle normą do robienia rzeczy takich jak ta, ale to pokazuje mi inną drogę :) – Ascherer

+2

@Achecher, tak, myślę, że * class_exists * jest bardziej elegancki, ponieważ nie dba o szczegóły implementacji. Myślę, że użyję tego w moim kodzie produkcyjnym. Niemniej jednak warto wiedzieć, jak sprawdzić rozszerzenia. Myślę, że get_extension_funcs nie działa, ponieważ redis eksponuje tylko klasę, nie ma funkcji. –

+0

bardzo prawdziwe :) nie mógł się zgodzić więcej – Ascherer

Powiązane problemy