nerdstock.org

PROJECTEN | HANDLEIDINGEN | OVERIGE
Nederlands   English

PHP extensies

Elke keer dat ik PHP op de commandline gebruikte, crashte het met een Segmentation fault: 11 (geheugendump gemaakt). Wat zoeken op internet vertelde me dat dit (in ieder geval op FreeBSD machines) kon komen door de volgorde waarin de PHP-extensies geladen worden.
Helaas kon ik geen site vinden waar de juiste volgorde op stond (wat ook een beetje komt door het feit dat ik 55 extensies geïnstalleerd heb; wie doet, laat staan documenteert, dat nou?).

rob@server:~> php -r 'echo "bla\n";'
bla
Segmentation fault: 11 (core dumped)
rob@server:~>

Maar eindelijk heb ik nu de juiste volgorde gevonden: ik kan PHP op de commandline gebruiken zonder core dump. Vandaar deze pagina.

Een pagina die me een aardig eind op de goede weg hielp, is pingle.org van Jim Pingle; hij heeft een script geschreven dat de volgorde van de modules wijzigt in /usr/local/etc/php/extensions.ini (ik denk dat dat /etc/php/extensions.ini is onder Linux), en op die manier krijgt hij zijn installatie in ieder geval zonder problemen aan de praat.
Helaas kreeg ik na het uitvoeren van dat script nog steeds een core dump…

Een beetje verder zoeken bracht me toen op het blog van Gamecreature; in een reply op een reply op zijn post beschrijft hij hoe hij uit de core dump leest welke extensie een probleem geeft. Dus dat heb ik ook gedaan:

rob@server:~> gdb php ./php.core 
GNU gdb 6.1.1 [FreeBSD]                                                                     
Copyright 2004 Free Software Foundation, Inc.                                               
GDB is free software, covered by the GNU General Public License, and you are                
welcome to change it and/or distribute copies of it under certain conditions.               
Type "show copying" to see the conditions.                                                  
There is absolutely no warranty for GDB.  Type "show warranty" for details.                 
This GDB was configured as "sparc64-marcel-freebsd"...                                      
Core was generated by `php'.                                                                
Program terminated with signal 11, Segmentation fault.                                      
Reading symbols from /lib/libcrypt.so.3...done.                                             
Loaded symbols for /lib/libcrypt.so.3                                                       
Reading symbols from /lib/libm.so.4...done.                                                 
Loaded symbols for /lib/libm.so.4                                                           
Reading symbols from /usr/local/lib/libxml2.so.5...done.                                    
Loaded symbols for /usr/local/lib/libxml2.so.5                                              
Reading symbols from /lib/libz.so.3...done.                                                 
Loaded symbols for /lib/libz.so.3                                                           
Reading symbols from /usr/local/lib/libiconv.so.3...done.                                   
Loaded symbols for /usr/local/lib/libiconv.so.3                                             
Reading symbols from /lib/libc.so.6...done.                                                 
Loaded symbols for /lib/libc.so.6                                                           
Reading symbols from /usr/local/lib/php/20060613-debug/session.so...done.                   
Loaded symbols for /usr/local/lib/php/20060613-debug/session.so                             
Reading symbols from /libexec/ld-elf.so.1...done.                                           
Loaded symbols for /libexec/ld-elf.so.1                                                     
#0  0x0000000000000000 in ?? ()                                                             
(gdb) bt                                                                                    
#0  0x0000000000000000 in ?? ()                                                             
#1  0x000000004862506c in __do_global_dtors_aux () from /usr/local/lib/php/20060613-debug/session.so
#2  0x0000000048632eec in _fini () from /usr/local/lib/php/20060613-debug/session.so                
#3  0x000000004055e7dc in elf_hash () from /libexec/ld-elf.so.1                                     
#4  0x000000004055e7dc in elf_hash () from /libexec/ld-elf.so.1                                     
Previous frame identical to this frame (corrupt stack?)                                             
(gdb) quit
Het probleem was dus de session extensie.

Vervolgens heb ik, naar het voorbeeld van Jim Pingle, de session extensie helemaal onderaan extensions.ini geplaatst, en heb ik vervolgens zijn script weer uitgevoerd om te zorgen dat de volgorde verder weer klopte.
Dit leverde niet het gewenste resultaat:

rob@server:~> php -r 'echo "bla\n";'
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20060613-debug/wddx.so' - /usr/local/lib/php/20060613-debug/wddx.so: Undefined symbol "ps_globals" in Unknown on line 0                                                                                       
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20060613-debug/memcache.so' - /usr/local/lib/php/20060613-debug/memcache.so: Undefined symbol "php_session_create_id" in Unknown on line 0                                                                    
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20060613-debug/soap.so' - /usr/local/lib/php/20060613-debug/soap.so: Undefined symbol "ps_globals" in Unknown on line 0                                                                                       
bla
Segmentation fault: 11 (core dumped)

Maar dit zijn in ieder geval duidelijke foutmeldingen, dus ik heb wddx, memcache en soap onder session gezet, en Jims script weer gedraaid.
Helaas: een volgende test gaf weer een core dump, en het onderzoeken van die core dump gaf weer aan dat het aan session lag.

Tja, toen lag het eigenlijk wel voor de hand: als session niet onderaan het bestand mag staan, dan probeer je het helemaal bovenaan. En dat was de oplossing: PHP werkt nu foutloos vanaf de commandline:

rob@server:~> php -r 'echo "bla\n";'
bla
rob@server:~>

Voor de volledigheid zet ik hieronder nog even mijn /usr/local/etc/php/extensions.ini. Als deze voor jou niet werkt (zorg dat je de extensies verwijdert die je niet geïnstalleerd hebt), weet je nu in ieder geval hoe je dichter bij een oplossing kunt komen.

extension=session.so
extension=fileinfo.so
extension=crack.so
extension=ssh2.so
extension=imagick.so
extension=ldap.so
extension=simplexml.so
extension=dba.so
extension=ctype.so
extension=apc.so
extension=ftp.so
extension=mbstring.so
extension=tokenizer.so
extension=filter.so
extension=pgsql.so
extension=gmp.so
extension=mcrypt.so
extension=tidy.so
extension=xmlwriter.so
extension=mhash.so
extension=gd.so
extension=ncurses.so
extension=readline.so
extension=gettext.so
extension=iconv.so
extension=dbase.so
extension=calendar.so
extension=exif.so
extension=zlib.so
extension=curl.so
extension=mailparse.so
extension=xmlrpc.so
extension=bz2.so
extension=sysvmsg.so
extension=pdf.so
extension=openssl.so
extension=ming.so
extension=dom.so
extension=hash.so
extension=xmlreader.so
extension=gnupg.so
extension=bcmath.so
extension=pcre.so
extension=xsl.so
extension=wddx.so
extension=memcache.so
extension=soap.so
extension=spl.so
extension=sqlite.so
extension=mysqli.so
extension=mysql.so
extension=imap.so
extension=sockets.so
extension=pspell.so
extension=xml.so

Reacties zijn welkom:
rob[at]nerdstock.org
Creative Commons License
http://creativecommons.org/licenses/by-nc-sa/3.0/nl/deed.nl

 


-i *.nerdstock.org/*
Nerds don't google, they grep.

Dannik
http://dannik.nl
FaciliPro
http://facilipro.nl
HoudtVan.je
http://www.houdtvan.je
OhReally.nl
http://OhReally.nl
Setara
http://setara.org
Ads by Nerdstock.org

Link: Op deze site gebruikte handelsmerken