GeoIP, PECL, Zend Server z PHP 5.3 i SnowLeopard
Opublikowano: 19.06.2010 | Kategoria: Apple, Programowanie | Tagi: geoip, kompilacja, macosx | Brak komentarzy »Potrzebowałem na maszynie developerskiej (z jabłkiem na obudowie) rozpoznawania lokalizacji klientów na podstawie adresów IP. Rozwiązanie manualowe zakończyło się błędem:
$ sudo /usr/local/zend/bin/pecl install geoip (...) configure: error: Please reinstall the geoip distribution ERROR: `/private/tmp/pear/temp/geoip/configure' failed
Próba instalacji przez PEAR, skierowała mnie na nowo do PECLa. Wniosek prosty – czegoś brak. Poszukałem rozwiązania w mac portach:
$ port search geoip
libgeoip @1.4.6 (devel, net)
Gets country code by IP address
ISTOTNA UWAGA. Ponieważ Zend Server na MacOSX jest tylko w wersji 32 bit, musimy na chwilę namieszać, bo inaczej Zend nie łyknie nowego modułu, ze względu na niezgodność architektury (PHP będzie pluło ostrzeżeniami: PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/local/zend/lib/php_extensions/geoip.so’ – dlopen(/usr/local/zend/lib/php_extensions/geoip.so, 9): no suitable image found. Did find: /usr/local/zend/lib/php_extensions/geoip.so: mach-o, but wrong architecture in Unknown on line 0). W pliku /opt/local/etc/macports/macports.conf musimy odkomentować build_arch i386:
# CPU architecture to compile for. Defaults to i386 or ppc on Mac OS X 10.5 # and earlier, depending on the CPU type detected at runtime. On Mac OS X 10.6 # the default is x86_64 if the CPU supports it, i386 otherwise. build_arch i386
Zapisujemy zmiany i instalujemy port z libgeoip.
$ sudo port install geoip ---> Computing dependencies for libgeoip ---> Fetching libgeoip ---> Attempting to fetch GeoIP-1.4.6.tar.gz from http://lil.fr.distfiles.macports.org/libgeoip ---> Verifying checksum(s) for libgeoip ---> Extracting libgeoip ---> Configuring libgeoip ---> Building libgeoip ---> Staging libgeoip into destroot ---> Installing libgeoip @1.4.6_0 ---> Activating libgeoip @1.4.6_0 ---> Cleaning libgeoip $ geoiplookup technicznie.miastofabryk.pl GeoIP Country Edition: NL, Netherlands $ file /opt/local/bin/geoiplookup /opt/local/bin/geoiplookup: Mach-O executable i386
Śmiga. I jest w wersji 32 bitowej. Wstawiamy ponownie komentarz w /opt/local/etc/macports/macports.conf:
# build_arch i386
Wracamy do PECLa… ściągamy paczkę i ją rozpakowujemy:
$ cd; mkdir temp; cd temp $ /usr/local/zend/bin/pecl download geoip downloading geoip-1.0.7.tgz ... Starting to download geoip-1.0.7.tgz (9,416 bytes) .....done: 9,416 bytes File /Users/skar/temp/geoip-1.0.7.tgz downloaded $ tar xvf geoip-1.0.7.tgz (...) $ cd geoip-1.0.7
Teraz czas na konfigurację i kompilację modułu geoip dla PHP:
$ export "CFLAGS=-arch i386" $ /usr/local/zend/bin/phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 $ ./configure --with-php-config=/usr/local/zend/bin/php-config --disable-shared (...) $ make (...) $ sudo make install Password: Installing shared extensions: /usr/local/zend/lib/php_extensions/
W katalogu /usr/local/zend/lib/php_extensions/ powinien pojawić się plik geoip.so. Jeżeli plik istnieje, to wszystko przebiegło prawidłowo. Odpalamy teraz konfigurację Zend Server (http://localhost:10081/ZendServer) i wchodzimy w Server Setup/Extensions i klikamy Turn On przy geoip. Restartujemy PHP. Powinno działać.