====== PHP ======
{{:programmiersprachen:php-logo.png|Logo PHP}} [[wpde>PHP]] ist eine einfach zu erlernende [[wpde>Skriptsprache]] die vorrangig für dynamische Webinhalte verwendet wird.
Daneben kann es allerdings auch auf der Kommandozeile (php-cli) und mit clientseitigen GUI-Anwendungen (http://gtk.php.net) benutzt werden.
* **[[Entwickeln mit PHP]]**
===== Installation des Grundsystems =====
PHP ist in zwei Versionen in den Paketquellen enthalten, PHP5 und PHP4. Nicht allen PHP-Skripten ist es egal, unter welcher Version sie ausgeführt werden. Viele aktuelle PHP-Skripte brauchen mittlerweile PHP5, viele alte sind nur kompatibel zu PHP4. Hier muss man sich informieren, welche PHP-Version man installiert haben muss. Üblicherweise sind jedoch alle aktuellen Skripte inzwischen an PHP5 angepasst.
==== PHP7.x ====
=== PHP7 auf Debian Jessie ===
# packages.sury.org
deb https://packages.sury.org/php/ jessie main
wget https://www.dotdeb.org/dotdeb.gpg
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
fcgi:
apt install php7.2 php7.2-cgi php7.2-cli php7.2-curl php7.2-gd php7.2-imagick php7.2-json php7.2-mcrypt php7.2-mysql php7.2-pspell php7.2-readline php7.2-tidy php7.2-apcu
mod_php
apt install libapache2-mod-php7.2 php7.2 php7.2-cli php7.2-curl php7.2-gd php7.2-imagick php7.2-json php7.2-mcrypt php7.2-mysql php7.2-pspell php7.2-readline php7.2-tidy php7.2-apcu
Standard-PHP-Auswahl auf 5.6 setzen:
update-alternatives --query php
update-alternatives --set php /usr/bin/php5
==== PHP5.x ====
Die alten PHP-Version, kann man über das Paket **php5** installieren.
===== Anbindungen =====
==== Apache ====
Bei der Installation von PHP wird auch automatisch das passende Modul für den Webserver [[http://wiki.ubuntuusers.de/Apache|Apache]] installiert. Sollte bei der Installation dieses Paket nicht hinzugefügt worden sein, so kann man diese Pakete nachinstallieren.
* **libapache2-mod-php5** - für PHP5 als Modul mod_php (alles läuft unter der UID vom Webserver, z.B. www-data)
* libapache2-mod-suphp - UID für unterschiedliche Benutzer setzen
* [[http://www.phphatesme.com/blog/allgemein/php-fpm-mit-der-lizenz-zum-verwalten/|PHP-FPM]] als fast-cgi-Ersatz
Wenn nach der Installation von Apache und PHP die PHP-Dateien nicht angezeigt sondern nur heruntergeladen werden, so kann es sein, dass das Apache Modul nicht ordentlich aktiviert wurde: a2enmod php5
.
==== MySQL ====
Als Datenquelle für viele PHP Skripte dienen MySQL Server. Zusammen mit Apache und PHP macht das dann einen LAMP Server (Linux, Apache, MySQL und PHP). Die Anbindung an [[http://wiki.ubuntuusers.de/MySQL|MySQL]] kann über dieses Paket installiert werden:
* **php5-mysql**
==== PostgreSQL ====
Eine weitere Datenquelle für die PHP-Skripte kann auch ein PostgreSQL-Server benutzt werden. ([[http://wiki.ubuntuusers.de/PostgreSQL|mehr]])
===== Einige nützliche PHP Erweiterungen =====
Es gibt noch zahlreiche andere nützliche Erweiterungen für PHP, die einfach aus den Quellen installiert werden können. Für PHP5 sind dies unter anderem:
* **php5-cgi** - CGI-Skripte ausführen.
* **php5-curl** - Curl-Unterstützung (Damit kann man Dateien über verschiedene Protokolle übertragen.)
* **php5-gd** - Bilder generieren und manipulieren mit PHP (z.B. für Prozentanzeigen).
* **php5-imagick** (//universe//) - Bilder per [[http://wiki.ubuntuusers.de/Imagemagick|Imagemagick]] manipulieren.
* **php5-imap** (//universe//) - IMAP-Unterstützung.
* **php5-pgsql** - Das Gleiche wie php5-mysql, nur für das Datenbanksystem PostgreSQL.
* **php5-sqlite3** (//universe//) - Daten per PHP in einer sqlite3 Datenbank ablegen.
* **php5-cli** - PHP-Skripte über die Konsole ausführen
===== Konfiguration =====
==== Upload-Limits ====
in der php.ini:
; Maximum allowed size for uploaded files.
upload_max_filesize = 40M
; Must be greater than or equal to upload_max_filesize
post_max_size = 40M
===== Upgrade auf neuere Version =====
Siehe http://www.php.net/manual/de/install.unix.debian.php und nach Paket-Anbieter "Guillaume Plessis" suchen. Hier ist immer das aktueller PHP mit allen Zusatz-Paketen verfügbar. Vor dem Upgrade Apache stoppen.
deb http://packages.dotdeb.org stable all
===== Links =====
* [[http://www.php-faq.de/|de.comp.lang.php.* FAQ]]
* [[http://www-128.ibm.com/developerworks/opensource/top-projects/php.html|PHP project resources]]
* [[http://www.heise.de/developer/artikel/Die-Entwicklung-von-PHP-5-4-im-Ueberblick-1473269.html|Die Entwicklung von PHP 5.4 im Überblick]]
==== Tutorials ====
* [[http://www.selfphp.info/|SelfPHP]]
* [[http://www.schattenbaum.net/php/|PHP für dich (PHP-tutorial)]]
* [[http://www.hudzilla.org/phpbook/|Practical PHP Programming]]
* [[http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP|Wikibooks: Websiteentwicklung: PHP]]
* [[http://aktuell.de.selfhtml.org/tippstricks/php/|PHP-Tricks]]
* [[http://www.selfphp.info/index.php|SELFPHP]] [[http://www.selfphp.info/kochbuch/index.php|PHP Kochbuch]] [[http://www.selfphp.info/praxisbuch/index.php|PHP 5 Praxis]]
* [[http://mgeisler.net/php-tutorial/|Einfacher Einstieg in PHP]]
* [[http://www.tutorialized.com/tutorials/PHP/1]]
* [[http://tut.php-q.net/|Php-Tutorial von Quake.net]]
* [[http://www.randomchaos.com/documents/?source=php_and_unicode|How to develop multilingual, Unicode applications with PHP]]
* [[http://manuals.phpforum.de/php/|ein PHP Handbuch]]
==== Sicherheit ====
* [[http://www.heise.de/security/artikel/84149/0|Gesundes Misstrauen - Sicherheit von Webanwendungen]]
==== Code-Schnipsel ====
* [[http://www.php-resource.de/|PHP-resource.de]]
* [[http://www.php-archiv.de/|phparchiv.de]]
* [[http://www.dynamicwebpages.de/03.skript-archiv.php|Skript Archiv]]
* [[http://www.artmedic-phpscripts.de/|artmedic Freeware PHP-Scripts]]
* [[http://www.script-fundgrube.de/|Script-Fundgrube]]
==== etc ====
* [[http://wiki.ubuntuusers.de/PHP|kurze Übersicht zu PHP]] (teilweise Quelle dieses Artikels)
* [[http://phpxref.com/|phpXref - a PHP cross referencing documentation generator]]
* [[http://it.slashdot.org/article.pl?sid=07/09/09/215230|PHP5 Vs. CakePHP Vs. RubyOnRails?]]
===== PHP-Absichern =====
Erste Regeln:
* Benutzerein- und allgemein (z.B. Funktionen [[http://php.net/manual/en/function.strip-tags.php|strip_tags()]], [[http://www.php.net/manual/en/function.htmlspecialchars.php|htmlspecialchars()]]), [[http://www.php.net/manual/de/function.escapeshellarg.php|escapeshellarg()]].
* gegen XSS- (Ausgaben filtern!) und
* SQL-Injection-Angriffe absichern (Datenbankspezifische Funktionen, bei [[datenbanken:mysql]] mit [[http://www.php.net/mysql_real_escape_string|mysql_real_escape_string()]] oder bei Oracle mit gebundenen Funktionen (PDO-Erweiterung). Funktioniert ein Anhängen von SQL-Befehlen, z.B. http://URL.TLD/eingabe.php?id=1' SQL Befehl)?
* Konstruktion von Dateinamen mit [[http://www.php.net/manual/de/function.realpath.php|realpath()]] oder [[http://www.php.net/manual/de/function.basename.php|basename()]]
* Sessions absichern: [[http://www.php.net/manual/de/function.session-regenerate-id.php|session_regenerate_id()]] bei jeder Änderung der Berechtigungsstufe. Speicherort der Session-Dateien in eigenes Verzeichnis verlegen: ''php_value session.save_path /Pfad/zu/SeesionDateien'' . :!: Am besten Sessions über eine Datenbank verwalten und keine Datei verwenden (erfordert eigene Funktionen für die Sessionverwaltung).
* Dateiuploads misstrauen (Dateinamen: [[http://www.php.net/manual/de/function.is-uploaded-file.php|is_uploaded_file()]] [[http://www.php.net/manual/de/function.move-uploaded-file.php|move_uploaded_file()]]
* Dateirechte beim erzeugen gleich richtig setzen:[[ http://www.php.net/manual/de/function.umask.php|umask(077)]]
* lieber eingebaute Funktionen benutzen als Befehle auf der Shell auszuführen
* Variablen initialisieren
Evtl. deaktiviert man auch ganze Funktionen (global in der php.ini z.B. mit ''disable_functions = system''): all-inkl (ein Hosting-Anbieter) deaktiviert z.B. exec(), system(), passthru(), shell_exec(), popen(), escapeshellcmd(), proc_open(), proc_nice(), ini_restore(), eval() ist auch nicht ganz ohne.
:!: man sollte niemals von Benutzern eingegebene Werte mit eval(), preg_replace() incl. /e-Option oder an Systembefehle (wie system(), popen(), passthru() und den Backtick-Operator (``) übergeben.
So etwas muss man letztendlich aber im Anbetracht der Nutzer und den eingesetzten Anwendungen entscheiden.
Tip: Die PHP-Version eines Webservers lässt sich mit dem Aufruf einer beliebigen php-Datei z.B. ''index.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000'' aus den Response-Headern auslesen (z.B. X-Powered-By: PHP/4.4.4).
Viele der Einstellungen können auch in der httpd.conf (nach dem folgenden Muster) für einzelne Verzeichnisse festgelegt werden: ''php_admin_value open_basedir /var/www/verz1'' .
* ''register globals = off'' : keine globale Variablen können mehr überschrieben werden, siehe [[http://www.heise.de/newsticker/meldung/73656|DARUM register globals off]]. Grund ist das Aufgrund der Standard-variables_order GET oder POST-Parameter vor Cookies verarbeitet werden und der Benutzer also mit einem manipiulierten Cookie evtl. globale Paramter überschreibt. Außerdem sind nicht initialisierte Variablen gefärdet. (Modus ab Version 5.4 entfernt)
* ''allow_url_fopen = off'' bzw. ''allow_url_include'' (in PHP 5.2.x): keine Skripte von anderen Server können eingebunden werden. Allerdings nicht 100%ig sicher, da ''php://input'' or ''data://''-URLs weiterhin möglich sind
* ''safe-mode = on'' : Dateizugriff nur noch auf Dateien mit Besitzer des Webserverbenutzers, siehe [[http://de.php.net/manual/de/features.safe-mode.php|SafeMode Doku]] (Modus ab Version 5.4 entfernt)
* ''open_basedir = /Pfad'' : Außerhalb dieses Verzeichnisses ist kein Zugriff erlaubt
* ''display_errors = off'' : schaltet u.U. verräterische PHP-Fehlermeldung aus
* Dateiupload-Überlauf (bei POSTs) verhindern (hier 1 MB): ''post_max_size = 1024768''
* [[http://www.php-faq.de/q/q-magic-quotes.html|magic_quotes_gpc = Off]] (Modus ab Version 5.4 entfernt)
==== Links ====
* [[http://www.heise.de/security/artikel/96564/Grundsicherung-fuer-PHP-Software|PHP-Anwendungen individuell absichern]]
* [[http://www.hardened-php.net/|Hardened PHP-Projekt]] bietet einen [[http://www.hardened-php.net/index.14.html|Hardening-Patch]]. Er ist allerdings nicht binärkompatibel zum orginalen PHP
* dafür gibt es **[[http://www.hardened-php.net/suhosin.127.html|Suhosin]]** ([[http://www.howtoforge.com/suhosin_php_debian_etch_ubuntu|Suhosin (Debian) HowTo]])
* [[http://www.securityfocus.com/infocus/1706|Securityfocus: Securing PHP]]
* [[http://developers.slashdot.org/comments.pl?sid=211706&cid=17234626|Re:Not up-to-date on PHP security]]
* [[http://www.heise.de/newsticker/meldung/73837|PHP-Sicherheit: Vorsicht vor popen() und proc_open(]]
===== PHP optimieren =====
* [[http://itst.net/654-php-on-fire-three-opcode-caches-compared|[Update] PHP on Fire: Five Opcode Caches compared.]]
* [[http://www.ipersec.com/index.php?q=en/bench_ea_vs_apc|Benchmarking PHP accelerators]]
==== APC ====
Benutzbar bis incl. PHP-Version 5.4 (Debian Wheezy).
* [[http://pecl.php.net/package/APC|APC]]
* [[http://www0.fh-trier.de/%7Ebeckerr/apcphpgui.phtml|APC Gui]]
Installation:aptitude install php-apc && /etc/init.d/apache2 reload
Statistiken anzeigen: cp /usr/share/doc/php-apc/apc.php /srv/www/
==== APCu ====
Ab PHP-Version 5.5 (Debian Jessie).
Installation:aptitude install php5-apcu && /etc/init.d/apache2 reload
Statistiken anzeigen: cp /usr/share/doc/php5-apcu/apc.php /srv/www/
==== PHP Zend Optimizer ====
Der PHP Zend Optimizer ist Teil der Zend Plattform die auch debugging und monitoring leistet.
* [[http://www.zend.com/store/products/zend-optimizer.php]]
* [[http://www.administrator.de/PHP_Zend_Optimizer_installieren.html|Zend installieren]]
==== Turck MMCache ====
* [[http://turck-mmcache.sourceforge.net/|Turck MMCache]] ist ein PHP-Beschleuniger, -Optimierer, -Encoder und dynamischer Content-Cache. Turck MMCache erhöht die Performance von PHP-Scripts indem sie im kompiliertem Status gecacht werden, so das der bei der Kompilierung entstehende Overhead praktisch komplett eliminiert wird. Es verwendet auch einige Optimierungen, welche die Ausführung von PHP-Scripts beschleunigen. In der Regel wird die Ausführungsgeschwindigkeit von PHP-Script um den Faktor 1-10 erhöht.
==== eAccelerator ====
* [[http://eaccelerator.net/|eAccelerator]]: "free open-source PHP accelerator, optimizer, and dynamic content cache" Ableger von Turck MMCache
==== ionCube Encoder ====
ionCube Encoder ist kommerziell und versucht den Code zu verstecken und vor Veränderung zu schützen. Dabei optimiert er auch etwas, aber alles in allem dafür nicht wirklich zu gebrauchen.
==== XCache ====
[[http://trac.lighttpd.net/xcache/|XCache Homepage]]
===== Header-Manipulationen mit PHP =====
* **301 moved permanently** (redirect):
* **302 moved temporarily** (redirect):
* **404 Page Not Found**:
*** Service not avaliable**:
* **Content-Type setzen** (hier CSS):
* **Cache** (zwingt Browser Dateien nicht zu cachen):
* **Download dialog**:
* **Authentifizierung** (Browser öffnet ein Benutzername/Passwort-Dialog) - funktioniert nur wenn PHP als [[apache:Apache]]-Modul läuft: