PHP
Der PHP-Port wurde vor einiger Zeit in verschiedene Sub-Ports unterteilt darum braucht es hier ein bisschen mehr Aufwand. PHP kann man als CLI-Version, als Apache-Modul und für Apache in einer CGI-Wrapper-Konfiguration haben. Zudem gibt es noch einen Super-Port der alle Varianten bildet.
Inhaltsverzeichnis |
Build-Varianten
Apache-Modul
In den meisten Fällen wird PHP nur als Apache-Modul benötigt. Mit folgenden Zeilen ist die Sache gegessen:
-su-2.05b# cd /usr/ports/www/mod_php4 -su-2.05b# make install clean
CLI
Nur in seltensten Fällen braucht man nur den CLI-Interpreter:
-su-2.05b# cd /usr/ports/lang/php4-cli -su-2.05b# make install clean
CGI-Wrapper für Apache
Diese Variante habe ich noch nie benutzt. Einige Administratoren schwören auf diese Konfiguration aus Sicherheitsüberlegungen. Darum der Vollkommenheit halber:
-su-2.05b# cd /usr/ports/www/php4-cgi -su-2.05b# make install clean
"All-In-One"-PHP
Will man die "eierlegende Wollmilchsau", so folgt man diesen Zeilen:
-su-2.05b# cd /usr/ports/lang/php4 -su-2.05b# make install clean
Installation
Ich wähle für die Installation die "eierlegende Wollmilchsau". Zunächst wechselt man ins richtige verzeichnis, und gibt ein:
-su-2.05b# cd /usr/ports/lang/php4 -su-2.05b# make
Dann kommen die Optionen, welche man Auswählen kann. Sollte man Apache 2.x benutzten, so sollte man dies hier auswählen. Die Debug Option brauchen nur Entwickler. IPv6 brauche ich nicht, da mein Webserver nur IPv4 spricht. Und gewisse Module haben mit Static OpenSSL einfach probleme. Daher wähle ich keines der optionen aus:
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Options for php4 4.3.11_1 x
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x [ ] APACHE2 Use apache 2.x instead of apache 1.3.x x x
x x [ ] DEBUG Enable debug x x
x x [ ] MULTIBYTE Enable zend multibyte support x x
x x [ ] IPV6 Enable ipv6 support x x
x x [ ] OPENSSL Build static OpenSSL extension x x
tqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjqu
x [ OK ] Cancel x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
Anschliessend wird das php4 Modul runtergeladen und kompiliert.
Wenn alles sauber läuft, so findet man folgenden output:
... main/internal_functions_cli.lo -lcrypt -lcrypt -lssl -lcrypto -lm -lcrypt -lcrypt -o sapi/cli/php Build complete. (It is safe to ignore warnings about tempnam and tmpnam).
Dann kann man installieren:
-su-2.05b# make install
Anschliessend gibts noch einen interessanten Output, den man unbedingt beachten sollte:
===> Installing for php4-4.3.11_1 ===> php4-4.3.11_1 depends on file: /usr/local/sbin/apxs - found ===> Generating temporary packing list ===> Checking if lang/php4 already installed Installing PHP SAPI module: apache [activating module `php4' in /usr/local/etc/apache/httpd.conf] cp libs/libphp4.so /usr/local/libexec/apache/libphp4.so chmod 755 /usr/local/libexec/apache/libphp4.so cp /usr/local/etc/apache/httpd.conf.new /usr/local/etc/apache/httpd.conf rm /usr/local/etc/apache/httpd.conf.new Installing PHP CLI binary: /usr/local/bin/ Installing PHP CLI man page: /usr/local/man/man1/ Installing build environment: /usr/local/lib/php/build/ Installing header files: /usr/local/include/php/ Installing helper programs: /usr/local/bin/ program: phpize program: php-config program: phpextdist *************************************************************** Make sure index.php is part of your DirectoryIndex. You should add the following to your Apache configuration file: AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps *************************************************************** ===> Compressing manual pages for php4-4.3.11_1 ===> Registering installation for php4-4.3.11_1
Aktivieren des PHP Modules im Apache
Netterweise hat das PHP Installationsscript schon das lauffähige Modul ins richtige Verzeichnis (/usr/local/libexec/apache/) kopiert. Wir müssen Apache nur noch beibringen, dass er .php Dateien mittels PHP parsen soll. Dazu editieren wir das Apache Configfile /usr/local/etc/apache/httpd.conf. Mit Apache 1.3.x ist index.php schon im DirectoryIndex - bei Apache 2.x muss das von Hand hinzugefügt werden.
DirectoryIndex index.php index.html
Anschliessend müssen wir nur noch irgendwo folgende zwei Zeilen hinzufügen:
AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
Nun sollte man Apche neu starten:
-su-2.05b# apachectl restart /usr/local/sbin/apachectl restart: httpd not running, trying to start /usr/local/sbin/apachectl restart: httpd started
Testen des PHP Modules
Am einfachsten erzeugt man eine Datei, die die phpinfo()-Funktion aufruft:
-su-2.05b# mkdir /usr/local/www/data/php -su-2.05b# echo "<?phpinfo();?>" > /usr/local/www/data/php/index.php
Und nun ruft man den Webbrowser auf: http://your.ip.addr.here/php/ und siehe da:
Anpassungen an php.ini
PHP wird konfiguriert mittels /usr/local/etc/php.ini. Da diese Datei noch nicht existiert, muss sie zunächst erstellt werden. Dazu kopiert der Installer zwei versionen ins /usr/local/etc/
- php.ini-dist: Das php.ini, dass im PHP installationspaket enthalten ist.
- php.ini-recommended: Das php.ini, dass der FreeBSD-Port-Maintainer für PHP empfiehlt.
Ich kopiere mir immer das php.ini-recommended:
-su-2.05b# cd /usr/local/etc/ -su-2.05b# cp php.ini-recommended php.ini
Extensions
PHP lebt von den vielen dazu verfügbaren Extensions. Da gibt es z.B. Extensions zu MySQL, ImageMagick oder PDF. Eine komplette Liste findet man im Makefile des PHP-Extension-Masterport (/usr/ports/lang/php4-extensions/Makefile).
Manuelle Installation einzelner Extensions
Wer lust kann, kann auch einzelne module von Hand installieren (dauert aber vieeeel länger). Am Besten sucht man nach dem entsprechenden modul:
-su-2.05b# cd /usr/ports/ -su-2.05b# make search name=php4-
Und installiert diese dann von Hand (make install clean....).
Installation mittels Masteport
Wenn man weiss, welche Extensions man installieren will passt man sich am besten direkt das /etc/make.conf-File an mit Zeilen im Stil von:
WITH_MYSQL=yes WITH_IMAGICK=yes WITH_PDF=yes
Da aber der Port weiterentwickelt wurde, kann man im extensions Verzeichnis einfach make eingeben, und ein Menu erscheint:
-su-2.05b# cd /usr/ports/lang/php4-extensions -su-2.05b# make
Anschliessend wählt man die ganzen Extensions aus, die man installieren möchte:
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Options for php4-extensions 1.0 x
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x [X] BCMATH bc style precision math functions x x
x x [X] BZ2 bzip2 library support x x
x x [X] CALENDAR calendar conversion support x x
x x [ ] CRACK crack support x x
x x [X] CTYPE ctype functions x x
x x [X] CURL CURL support x x
x x [ ] DBA dba support x x
x x [ ] DBASE dBase library support x x
x x [ ] DBX dbx support x x
x x [ ] DIO Direct I/O support x x
x x [ ] DOMXML DOM support x x
x x [X] EXIF EXIF support x x
x x [X] FILEINFO fileinfo support x x
x x [ ] FILEPRO filePro support x x
x x [ ] FRIBIDI FriBidi support x x
x x [ ] MNOGOSEARCH mnoGoSearch support x x
x x [ ] MSSQL MS-SQL database support x x
x x [X] MYSQL MySQL database support x x
x x [ ] NCURSES ncurses support (CLI only) x x
x x [ ] ODBC unixODBC support x x
x x [ ] OPENSSL OpenSSL support x x
x x [ ] ORACLE Oracle support x x
x x [X] OVERLOAD user-space object overloading support x x
x x [ ] PANDA panda support x x
x x [ ] PCNTL pcntl support (CLI only) x x
x x [X] PCRE Perl Compatible Regular Expression support x x
x x [ ] PDF PDFlib support (implies GD) x x
x x [ ] PGSQL PostgreSQL database support x x
x x [X] POSIX POSIX-like functions x x
x x [ ] PSPELL pspell support x x
x x [X] READLINE readline support (CLI only) x x
x x [ ] RECODE recode support x x
x x [X] SESSION session support x x
x x [ ] SHMOP shmop support x x
x x [X] SNMP SNMP support x x
x x [X] SOCKETS sockets support x x
x x [ ] SYBASE_CT Sybase database support x x
x x [ ] SYSVMSG System V message support x x
x x [ ] SYSVSEM System V semaphore support x x
x x [ ] SYSVSHM System V shared memory support x x
x x [X] TOKENIZER tokenizer support x x
x x [ ] WDDX WDDX support (implies XML) x x
x x [X] XML XML support x x
x x [ ] XMLRPC XMLRPC-EPI support x x
x x [ ] XSLT XSLT Sablotron support x x
x x [ ] YAZ YAZ support (ANSI/NISO Z39.50) x x
x x [ ] YP YP/NIS support x x
x x [X] ZIP ZIP support x x
x x [X] ZLIB ZLIB support x x
tqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjqu
x [ OK ] Cancel x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
Sobald man OK drückt, wird die ganze Konfiguration gespeichert. Und man muss später nur noch installieren.
===> Found saved configuration for php4-extensions-1.0 ===> Extracting for php4-extensions-1.0 ===> Patching for php4-extensions-1.0 ===> Configuring for php4-extensions-1.0
Die Konfigurationdatei ist unter /var/db/ports/php4-extensions/options gepeichert und kann jederzeit mit "make config" neu erzeugt werden.
-su-2.05b# make config
Naja, auf jedenfall installieren wir jetzt die ganzen Optionen:
/usr/ports/lang/php4-extensions -su-2.05b# make install
Die ganzen Optionen findet man übrigens im phpinfo()-Output wieder.
Crash von ImageMagick (imagick.so)
Weg #1 (sauberste Lösung)
Wenn man den Port pecl-imagick (/usr/ports/graphics/pecl-imagick) mit GraphicsMagick backend kompiliert, hören die Probleme auch auf. Daher:
cd /usr/ports/graphics/pecl-imagick make config
Im Menu auswählen:
┌────────────────────────────────────────────────────────────────────┐ │ Options for pecl-imagick 0.9.11_4 │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ [X] GM Use GraphicsMagick backend │ │ │ │ │ │ │ │ ..... │ │ ├─└────────────────────────────────────────────────────────────────┘─┤ │ [ OK ] Cancel │ └────────────────────────────────────────────────────────────────────┘
Anschliessend neu kompilieren:
make make deinstall && make install
Weg #2 (dirty hack)
ImageMagick scheint gerne zu crashen (siehe auch unten mit ZendOptimizer). Führt man ein phpinfo() aus, so findet man im apache log:
httpd in free(): error: junk pointer, too high to make sense [Tue Feb 21 15:20:39 2006] [notice] child pid 22555 exit signal Abort trap (6)
Ein auskommentieren von imagick.so im /usr/local/etc/php/extensions.ini hat dazu geführt, dass alles sauber läuft. Das Problem lässt sich momentan fixen, dass man ImageMagick mit --enable-embeddable kompiliert.
Dazu fügt man im /usr/ports/graphics/ImageMagick/Makefile auf ca. Zeile 210 ein:
... .if defined(NOPORTDOCS) INSTALL_TARGET= install .else INSTALL_TARGET= install install-data-html .endif CONFIGURE_ARGS+= --enable-embeddable <-- Hinzufügen post-patch: # remove the autogenerated Magick.c so it will be regenerated from # Magick.xs on _this_ system: ...
Danach läuft ImageMagick im Web zwar aber im CLI erzeugt php -i immer einen core dump:
root@mrmouse(/usr/ports/graphics/ImageMagick)> php -i | more phpinfo() PHP Version => 4.4.2 ... ... If you did not receive a copy of the PHP license, or have any questions about PHP licensing, please contact license@php.net. Segmentation fault (core dumped)
Wie das zu beheben ist, steht noch aus...
Dazu gibt es im Bug Tool folgende offene Cases:
Pear
PEAR ist die Abkürzung für "PHP Extension and Application Repository". Der Quellcode in PEAR ist aufgeteilt in "Packages". Jedes Package ist ein selbständiges Projekt mit eigenem Entwickler-Team, Versionierung, Herausgabe-Zyklen und festgelgten Beziehungen zu anderen Packages (einschließlich äbhängigkeiten) Packages werden verteilt in Form von gepackten Daten (mit Hilfe von Tar und GZip). Jedes enthält eine beschreibende Datei; die Installation erfolgt auf dem eigenem Computer über den PEAR-Installer. Weiterführende Informationen findet man auf der Homepage von Pear.
Die Installation ist simpel:
-su-2.05b# cd /usr/ports/devel/php4-pear -su-2.05b# make install
Anschliessend muss nur noch die Datei /usr/local/etc/php.ini editiert werden. Der "include_path" muss entsprechend angepasst werden:
include_path = ".:/usr/local/share/pear"
Anschliessend nur noch Apache neustarten und schon sind die Änderungen aktiv.
ZendOptimizer
Der ZendOptimizer ist ein Nettes tool, um PHP scripts schneller auszugeben, da er gewisse Funktionen cached. Auch können Files, welche mit dem ZendEncoder vorkompiliert wurden so ausgeführt werden. Der ZendEncoder schützt den Sourcecode.
Die Installation lässt sich auch über die Ports abwickeln, jedoch mit einer kleinen Änderung. Da der ZendOptimiert unter einer anderen Lizenz ist, muss man den Code vorher selber runterladen. Dies wird auch so angezeigt:
-su-2.05b# cd /usr/ports/devel/ZendOptimizer -su-2.05b# make ===> ZendOptimizer-2.5.10 : Because of licensing restrictions, you must fetch the source distribution manually. Please access http://www.zend.com/store/free_download.php?pid=13 with a web browser, read the license and click the "I ACCEPT" button. Download the source file, ZendOptimizer-2.5.10-freebsd5.1-i386.tar.gz, and place it in /usr/ports/distfiles. .-su-2.05b#
Das File, dass man runtergeladen hat, sollte wie oben genannten ZendOptimizer-2.5.10-freebsd5.1-i386.tar.gz benannt werden, damit es gefunden werden kann. Sobald das file im /usr/ports/distfiles/ liegt, kann nochmal ein Install versucht werden:
-su-2.05b# make install ===> Installing for ZendOptimizer-2.5.10 ===> ZendOptimizer-2.5.10 depends on file: /usr/local/include/php/main/php.h - found ===> Generating temporary packing list ===> Checking if devel/ZendOptimizer already installed install -o root -g wheel -m 444 /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-2.5.10-freebsd5.1-i386/data/4_3_x_comp/ZendOptimizer.so /usr/local/lib/php/20020429/Optimizer/php-4.3.x/ZendOptimizer.so install -o root -g wheel -m 444 /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-2.5.10-freebsd5.1-i386/data/4_3_x_comp/TS/ZendOptimizer.so /usr/local/lib/php/20020429/Optimizer_TS/php-4.3.x/ZendOptimizer.so install -o root -g wheel -m 444 /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-2.5.10-freebsd5.1-i386/data/ZendExtensionManager.so /usr/local/lib/php/20020429 install -o root -g wheel -m 444 /usr/ports/devel/ZendOptimizer/work/ZendOptimizer-2.5.10-freebsd5.1-i386/data/ZendExtensionManager_TS.so /usr/local/lib/php/20020429 ******************************************************************************** You have installed the ZendOptimizer package. Edit /usr/local/etc/php.ini and add: [Zend] zend_optimizer.optimization_level=15 zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer" zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS" zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so" zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so" ******************************************************************************** ===> Registering installation for ZendOptimizer-2.5.10 -su-2.05b#
Anschliessend müssen noch folgende Zeilen ans Ende der /usr/local/etc/php.ini hinzugefügt werden:
[Zend] zend_optimizer.optimization_level=15 zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer" zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS" zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so" zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"
Anschliessend nur noch Apache neu starten, und schauen, ob der phpinfo()-output folgendes anzeigt:
This program makes use of the Zend Scripting Language Engine: Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies with Zend Extension Manager v1.0.7, Copyright (c) 2003-2005, by Zend Technologies with Zend Optimizer v2.5.10, Copyright (c) 1998-2005, by Zend Technologies
Problem/CoreDump mit ZendOptimizer
Auf gewissen Konfigurationen wurde ein Problem gefunden, dass der Apache mit hässlichen Meldungen abstürzt:
Sep 11 23:28:54 temp kernel: pid 93063 (httpd), uid 80: exited on signal 11 Sep 11 23:28:54 temp kernel: pid 93064 (httpd), uid 80: exited on signal 11 Sep 11 23:28:54 temp kernel: pid 93066 (httpd), uid 80: exited on signal 11 Sep 11 23:28:54 temp kernel: pid 93042 (httpd), uid 0: exited on signal 11 (core dumped)
Apache wollte auf keinen Fall einfach Starten.
Beim debuggen habe ich gesehen, dass selbst php -v gedumpt hat:
-su-2.05b# php -v
PHP 4.4.0 (cli) (built: Sep 11 2005 23:13:26)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
with Zend Extension Manager v1.0.8, Copyright (c) 2003-2005, by Zend Technologies
with Zend Optimizer v2.5.10, Copyright (c) 1998-2005, by Zend Technologies
Segmentation fault (core dumped)
Ich konnte das Problem in der "imagick.so" finden. Bis ein Workaround/Fix vorhanden ist, sollte man einfach die Extension in der /usr/local/etc/php/extensions.ini auskommentieren. Sollte man das Modul dennoch benötigen so hat auch schon geholfen, PHP mit "Multibyte Support" zu kompilieren und/oder das Modul in der extentions.ini ganz nach oben zu Pflanzen.
Patches & Problemlösungen
Patch von mail.c für mail()-funktion
Seit längerem wird die mail()-Funktion von PHP dazu missbraucht, bei Web-Formularen Spam zu einzubringen. Diese Methode nennt sich mail header injection. Man kann durch simples patchen der mail.c Datei dem ein wenig entgegen wirken. Hier ein diff von php-4.4.2/ext/standard/mail.c:
--- php-4.4.2/ext/standard/mail.c Sun Jan 1 14:46:57 2006
+++ php-4.4.2/ext/standard/mail.c-patched Tue Mar 21 15:59:07 2006
@@ -103,6 +103,22 @@
return;
}
+
+ if (headers_len > 0 && headers && (strstr(headers,"\n\n") || strstr(headers,"\r\n\r\n")) ) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "possible mail injection. found bogus newlines in headers. mail dropped");
+ RETURN_FALSE;
+ }
+
+ if (strchr(to, '\n') != NULL || strchr(to, '\r') != NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "possible mail injection. found bogus newline in header. mail dropped");
+ RETURN_FALSE;
+ }
+
+ if (strchr(subject, '\n') != NULL || strchr(subject, '\r') != NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "possible mail injection. found bogus newline in subject. mail dropped");
+ RETURN_FALSE;
+ }
+
if (to_len > 0) {
to_r = estrndup(to, to_len);
for (; to_len; to_len--) {
