Gyorstipp: Drush hibaüzenet „undefined function module_exists()” megoldása
Március 28-án egy súlyos Drupal biztonsági hiba került napvilágra, ami négy kiadást is érintett. Emiatt gyorsan neki kellett állni az általam karbantartott utolsó Drupal 6-os oldal frissítésének. Mint minden rendes Drupal fejlesztő a drush-sal igyekeztem elkezdeni a frissítést, akkor kaptam az „undefined function module_exists()” hibaüzenetet, aminek a megoldása egyszerű, csak rájönni nem az.
A hivatkozott module_exists()
funkció a Drupal 6 core része, ezért furcsa hogy nem tudja elérni a drush. Egy gyors Google keresés pedig olyan találatokat fog feldobni, hogy a mysql-client csomag hiánya okozza mindezt. Ez elsőre butaságnak tűnhet, de a kutya tényleg itt van elásva. Ha a drush nem képes felépíteni az adatbázis kapcsolatot, akkor nem fogja betölteni a Drupal core fájlokat, és így a module_exists funkció sem kerül definiálásra.
Viszont könnyen lehet, hogy a galibát nem a hiányzó mysql-client okozza. Érdemes kiadni a kívánt parancsot a –debug kapcsolóval, és akkor több infót kapunk, például ezt:
mysql extension for PHP is not installed. Check your php.ini to see how you can enable it. [0.21 sec, 7.29 MB] DB credentials are invalid. [0.21 sec, 7.29 MB] PHP Fatal error: Uncaught Error: Call to undefined function module_exists() in /var/www/wesnoth/drupal6/vendor/drush/drush/commands/core/drupal/environment_6.inc:172
Az első két sorból valóban következhet az, hogy nincs telepítve a mysql-client. Azonban simán lehet, hogy a php-cli konfigurációban nincs jól definiálva a mysqli könyvtár. Vagy beállítjuk a php-clit, vagy megadjuk a drushnak, hogy melyik PHP binárissal futtassa a parancsunkat:
export DRUSH_PHP=/usr/bin/php5.6; drush site-upgrade nextgen
Így a drush már nem fog találgatni, hanem az általunk megadott, és nagy valószínűséggel jól működő PHP binárist fogja használni.