Réorganiser la liste des extensions PHP

Il m’est arrivé que php segfault (plante) sans raison apparente et sans logger aucune information, le script ci-dessous réorganise l’ordre dans lequel les modules sont chargé.

#!/bin/sh

# =============================================================
# Fix php/extensions.ini order
#
# Script based on the idea and information(s) of
# - http://www.pingle.org/2007/09/22/php-crashes-extensions-workaround
# - http://nerdstock.org/php_extensions
#
# Please copy your original php/extensions.ini to a save place before
# running this script!
#
# There is no guaranty the script is working for you or don't damage
# your system. Use at own Risk!
#
# 2011-04-03 olli hauer
#
# License: BSD
#  http://www.freebsd.org/copyright/freebsd-license.html

INI=/usr/local/etc/php/extensions.ini

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


if [ ! -e ${INI} ] ; then
    echo "cannot find ${INI}"
    exit 1
fi

# cleanup previous run
[ -e ${INI}.new ] && rm -f ${INI}.new
cp -f ${INI} ${INI}.work

for e in ${EXT}; do
    if egrep -q "^extension=${e}" ${INI}.work ; then
        echo extension=${e} >> ${INI}.new
        sed -i '' -e "/${e}/d" ${INI}.work
    fi
done

if [ -s ${INI}.work ]; then
    echo "; additional extension(s) not known by $(basename $0)" >> ${INI}.new
    # sybase_ct needs to be loaded last.
    grep ^extension ${INI}.work | grep -v sybase_ct.so >> ${INI}.new
    grep ^extension=sybase_ct.so ${INI}.work >> ${INI}.new
    AE=1
fi
[ -e ${INI}.work ] && rm -f ${INI}.work
if cmp -s ${INI} ${INI}.new ; then
    echo "No changes found, remove ${INI}.new"
    rm -f ${INI}.new
    AE=0
fi

if [ ${AE} -ne 0 ]; then
cat << _EOF
==============================
New INI is saved as ${INI}.new

Additional extension(s) not known by $(basename $0)
are added to the end of new INI file.

Please review the new INI, and replace it on your own!
    Do some Basic tests:
    php -V
    php -m
    php -i
    apachectl graceful
    ...

_EOF
fi

cat << _EOF
If the segfault issue is not gone, or you cannot find the issue
    - ask on the ports@ mailing list
or
    - open a PR:
    Synopsys: lang/php5 Segmentation fault.
    Additional try debugging with command:
    gdb php ./php.core

    http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/debugging.html


_EOF

Suggestions de lecture :

comments powered by Disqus