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.
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.
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;
}
}
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? –
'dl' służy do ładowania rozszerzenia w czasie wykonywania – bitWorking
OK. Nie bardzo to lubię. –
Czy spojrzałeś na get_extension_funcs?
Nie, nie wiedziałem o tym. Co ciekawe, wydaje się działać dla xdebug, ale nie dla redis ani v8js. –
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
}
Dlaczego odwrotny ukośnik w nazwie klasy? –
Dla przestrzeni nazw, jeśli jesteś w środowisku przestrzeni nazw – Ascherer
Interesujące. Nie wiedziałem o tym. –
get_loaded_extensions pasuje do rachunku.
Zastosowanie tak:
$ext_loaded = in_array('redis', get_loaded_extensions(), true);
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
@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. –
bardzo prawdziwe :) nie mógł się zgodzić więcej – Ascherer
co z [extension_loaded] (http://php.net/manual/de/function.extension-loaded.php)? – bitWorking
@redreggae, a co ty napisałeś jako odpowiedź? :) –
może również używać klasy ReflectionExtension. Dodano to do mojej odpowiedzi – Ascherer