PHP

Aus Wiki.hidden.ch
Wechseln zu: Navigation, Suche

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.


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:

PHP phpinfo.jpg


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--) {

Weblinks