PHP

OSX 10.6 - Snow Leopard PHP 5.3.6
Beim Einrichten eines neuen Macs habe ich wieder einmal alles neu compiliert und dabei gleich die aktuelle PHP Version genommen: PHP 5.3.6 mit Freetype Support.
Voraussetzungen
Zunächst muss man einige benötigte Bibliotheken installieren. Download von:
- libpng: http://prdownloads.sourceforge.net/libpng/libpng-1.5.2.tar.gz?download (oder besser http://prdownloads.sourceforge.net/libpng/libpng-1.2.44.tar.gz?download - ich habe letztere verwendet, ob es mit 1.5 auch geht kann ich nicht sagen)
- libjpg: http://www.ijg.org/files/jpegsrc.v8c.tar.gz
- pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.12.tar.gz
- libmcrypt: http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download
Entpacken in /usr/local/src. Mit make install werden die Bibliotheken nach /usr/local/lib kopiert.
libjpg
./configure --enable-shared
make
make install
libpng
./configure --enable-shared
make
make install
pcre
./configure --enable-utf8 --enable-unicode-properties --disable-shared --enable-static
make
make install DESTDIR=/usr/local/src/pcre-8.12/pcre-local
Wenn diese nicht mit UTF-8 Support compiliert werden, gibt es den folgenden Fehler beim Aufruf von preg_replace:
preg_replace(): Compilation failed: unknown option bit(s) set at offset 0
libmcrypt
./configure --enable-shared
make
make install
Mögliche Änderung im PHP Source
Zunächst gelang mir das compilieren nur mit folgender Änderung. Später ging es ohne diese mit dem komplett unveränderten Sourcecode.
Editieren von ext/iconv/iconv.c
#define iconv libiconv
ändern in:
#define iconv iconv
Compilieren
cd /usr/local/src/php-5.3.6
MACOSX_DEPLOYMENT_TARGET=10.6
CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp"
CCFLAGS="-arch x86_64 -g -Os -pipe"
CXXFLAGS="-arch x86_64 -g -Os -pipe"
LDFLAGS="-arch x86_64 -bind_at_load"
export CFLAGS CXXFLAGS LDFLAGS CCFLAGS MACOSX_DEPLOYMENT_TARGET
./configure \
--with-iconv-dir=/usr \
--with-libiconv-prefix=/usr \
--with-iconv=/usr \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--disable-dependency-tracking \
--sysconfdir=/private/etc \
--with-apxs2=/usr/sbin/apxs \
--enable-cli \
--with-config-file-path=/etc \
--with-libxml-dir=/usr \
--with-openssl=/usr \
--with-kerberos=/usr \
--with-zlib=/usr \
--enable-bcmath \
--with-bz2=/usr \
--enable-calendar \
--with-curl=/usr \
--enable-exif \
--enable-ftp \
--with-gd \
--with-jpeg-dir=/usr/X11R6 \
--with-png-dir=/usr/X11R6 \
--with-freetype-dir=/usr/X11R6 \
--with-xpm-dir=/usr/X11R6 \
--with-ldap=/usr \
--with-ldap-sasl=/usr \
--enable-mbstring \
--enable-mbregex \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/tmp/mysql.sock \
--with-iodbc=/usr \
--enable-shmop \
--with-snmp=/usr \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-xmlrpc \
--with-xsl=/usr \
--with-pcre-regex=/usr/local/src/pcre-8.12/pcre-local/usr/local \
--enable-zip \
--with-mcrypt
Dann make
make
Und nun mache ich kein make install sondern kopiere das php Modul zum apache (und die http.conf anpassen):
cp libs/libphp5.so /usr/libexec/apache2/libphp5.3.6.so
Und siehe da - Freetype support klappt nun:
Nachtrag
Der oben beschrieben Vorgang funktionierte auf einen neuen Mac. Auf meinen "alten" MacBook Pro auf dem schon jede Menge Software installiert wurde über die Jahre hat es nicht geklappt. Die Fehlermeldung ist immer wieder libiconv oder iconv in allen Variationen. Alle Tips aus dem Internet haben nichts gebracht.
Letztlich hat es alles damit zu tun welche Bibliotheken in diversen Verzeichnissen herumliegen. Wie es dann funktioniert hat:
Macports
Macports komplett deinstallieren
pkg-config
pkg-config deinstallieren:
rm /usr/local/bin/pkg-config
rm /usr/local/share/man/man1/pkg-config.1
rm /usr/share/zsh/4.3.9/functions/_pkg-config
Diese Programm hat den Compiliervorgang komplett durcheinandergebracht, glaube ich.
Bibliotheks-Ordner /usr/local/lib
Zunächst habe ich den Ordner umbenannt, dass er nicht mehr gefunden wird. Dann die oben genannten Pakete installiert. Ergebniss: nur noch diese Pakete liegen in /usr/local/lib
/usr/lib/libpcre*
Die pcre Bibliotheken habe ich temporär verschoben. Andernfalls werden diese veralteten verwendet.
Der config cache...
Das Abstruse war, dass es trotzdem noch nicht funktioniert hat. Es hat erst funktioniert als ich den gesamten php Source-Ordner gelöscht und neu aus dem Archiv entpackt habe. Es scheint einen Cache zu geben, in dem die Pfade abgelegt sind und trotz neuem ./configure, make clean, make bleibt der Fehler. Evtl reicht auch die Datei config.cache zu löschen, aber das habe ich nicht verifiziert.
OSX 10.6 PHP 5.2.17
Ich brauche die Version 5.2.x zusätzlich zur 5.3.x für TYPO3 - nicht alle Extensions funktionieren mit 5.3. Also nochmal compilieren. Im Prinzip wie 5.3 nur mit anderen configure Optionen.
Mögliche Änderung
Zunächst gelang mir das compilieren nur mit folgender Änderung. Später ging es ohne diese mit dem komplett unveränderten Sourcecode (sieheoben "Nachtrag" - gilt auch für hier).
Editieren von ext/gd/libgd/gd_png.c
if (!png_check_sig (sig, 8)) { /* bad signature */
return NULL;
}
ändern in
if (!png_sig_cmp (sig, 0, 8) == 0) { /* bad signature */
return NULL;
}
Compilieren
./configure aufrufen mit:
./configure \
--with-iconv-dir=/usr \
--with-libiconv-prefix=/usr \
--with-iconv=/usr \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--disable-dependency-tracking \
--sysconfdir=/private/etc \
--with-apxs2=/usr/sbin/apxs \
--enable-cli \
--with-config-file-path=/etc \
--with-libxml-dir=/usr \
--with-openssl=/usr \
--with-kerberos=/usr \
--with-zlib=/usr \
--enable-bcmath \
--with-bz2=/usr \
--enable-calendar \
--with-curl=/usr \
--enable-exif \
--enable-ftp \
--with-gd \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/X11R6 \
--with-freetype-dir=/usr/X11R6 \
--with-xpm-dir=/usr/X11R6 \
--with-ldap=/usr \
--with-ldap-sasl=/usr \
--enable-mbstring \
--enable-mbregex \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-mysql=/usr/local/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--with-pdo-mysql=/usr/local/mysql \
--with-iodbc=/usr \
--enable-shmop \
--with-snmp=/usr \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-xmlrpc \
--with-xsl=/usr \
--with-pcre-regex=/usr/local/src/pcre-8.12/pcre-local/usr/local \
--enable-zip \
--with-mcrypt
Die ersten 3 Optionen mit iconv sind vielleicht nicht alle nötig. Aber so hat es jedenfalls funktioniert.
PHP 5.2 und 5.3 gleichzeitig
Um beide Versionen gleichzeitig zur Verfügung zu haben habe ich folgendes Setup (mein Standard ist PHP 5.2.11):
Konfiguration
Duplizieren der 5.2 Konfiguration
cp /etc/apache2/httpd.conf /etc/apache2/httpd-php53.conf
In der httpd-php53.conf folgende Einträge:
Listen 80
LoadModule php5_module libexec/apache2/libphp5.2.11.so
ersetzen mit:
Listen 81
LoadModule php5_module libexec/apache2/libphp5.3_osx.so
Aufruf
Um den Aufruf komfortabel mittels apachectl zu haben habe ich dieses Skript dupliziert:
cp -p /usr/sbin/apachectl /usr/sbin/apachectl2
In apachectl2 dann
LAUNCHD_JOB="/System/Library/LaunchDaemons/org.apache.httpd.plist"
ersetzen mit
LAUNCHD_JOB="/System/Library/LaunchDaemons/org.apache.httpd-php53.plist"
Die Datei org.apache.httpd-php53.plist sieht dann folgendermaßen aus (fett markiert sind die Änderungen):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<true/>
<key>Label</key>
<string>org.apache.httpd-php53</string>
<key>OnDemand</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/httpd</string>
<string>-f</string>
<string>/etc/apache2/httpd-php53.conf</string>
<string>-D</string>
<string>FOREGROUND</string>
</array>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>