PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Aktueller Stand von PHP 7: Deutlich geringerer Arbeitsspeicherverbrauch

with 5 comments

Ich möchte mir den aktuellen Stand von PHP 7 anschauen (Stand 20. Januar 2015), und habe dazu im letzten Blogartikel gezeigt wie man PHP 7 direkt aus dem Git-Repository selbst kompiliert. Ich habe nun also PHP 7 zur Verfügung:

$ sapi/cli/php -v
PHP 7.0.0-dev (cli) (built: Jan 20 2015 23:13:58)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

Vergleichen werde ich mit der aktuell unter Ubuntu 14.04 LTS verfügbaren Version PHP 5.5.9:

$ php -v
PHP 5.5.9-1ubuntu4.5 (cli) (built: Oct 29 2014 11:59:10)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

Da die eine Version selbst kompiliert ist und die andere von Ubuntu stammt sind sie in diesem Fall nicht ideal für einen Vergleich nutzbar, aber auf ein paar Bytes oder Prozente soll es mir nicht ankommen.

PHP 7 hat in diesem Fall keinen OPcache aktiviert, aber den benötige ich für meine Tests auf der Kommandozeile (CLI) nicht. Möchte man PHP via Webserver (PHP-FPM usw.) nutzen sollte man darauf achten den OPcache per php.ini zu aktivieren, um vergleichbare Ergebnisse zu bekommen.

Folgendes kleines Testscript werde ich mit beiden Versionen laufen lassen:

<?php

$a = array();
for ($i=1; $i<2000000; $i++) {
    $a[] = rand(100000000, 999999999);
}

echo "not real: ".(memory_get_peak_usage(false)/1024/1024)." MiB\n";
echo "real: ".(memory_get_peak_usage(true)/1024/1024)." MiB\n";

Und hier sind die jeweiligen Ergebnisse:

$ time php arraytest.php
not real: 275.61262512207 MiB
real: 276 MiB

real    0m1.119s
user    0m0.763s
sys     0m0.190s
$ $ time sapi/cli/php arraytest.php
not real: 96.334381103516 MiB
real: 98 MiB

real    0m0.414s
user    0m0.290s
sys     0m0.068s

Ui ui ui! Mit PHP 7 reduziert sich der Arbeitsspeicherverbrauch bei diesem Testarray (2.000.000 Zahlen als Values) um satte 65%!

Weniger Arbeitsspeicherverbrauch heißt nicht nur dass “mehr PHP” auf einem Server laufen kann, weniger Arbeitsspeicher heißt auch dass weniger Daten im Arbeitsspeicher abgelegt werden müssen, und weniger daraus gelesen werden muss, es impliziert also automatisch auch einen Performance-Boost. Wie man an den Laufzeiten erkennen kann ist PHP 7 auch ungefähr 3 Mal so schnell!

In richtigen Applikationen wie WordPress oder Typo3 usw. ist der Unterschied nicht ganz so groß, da spricht man von ungefähr 50% bis 110% mehr Laufzeit-Performance. Denn bei größeren Applikationen wird auch viel Zeit beim Warten auf die Datenbank verbraucht, und Warten ist genauso langsam in PHP 5.5 wie in PHP 7 ;-)

All diese Verbesserungen sind darauf zurückzuführen wie PHP intern Variablen und Arrays organisiert, den sogenannten ZVALs und Hashtables. Die detaillierten Informationen über die Änderungen an der Hashtable-Implementation von PHP 7 sollte man sich mal zu Gemüte führen.

Edit: Auf Wunsch habe ich auch noch PHP 5.6 getestet, hier die Ergebnisse:

wget http://de2.php.net/get/php-5.6.5.tar.gz/from/this/mirror
mv mirror php-5.6.5.tar.gz
tar -xzvf php-5.6.5.tar.gz
cd php-5.6.5/
./configure --prefix=/usr/local/php-5.6.5 --with-zlib --with-config-file-path=/usr/local/php-5.6.5/etc --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --enable-zip --with-imap --with-kerberos --with-imap-ssl --with-openssl --with-jpeg-dir --with-gd --with-gettext --with-freetype-dir --enable-ftp --with-pspell --with-curl
make
$ sapi/cli/php -v
PHP 5.6.5 (cli) (built: Jan 23 2015 00:46:40)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
$ time sapi/cli/php -d memory_limit=512M arraytest.php
not real: 275.61260223389 MiB
real: 276 MiB

real    0m1.023s
user    0m0.663s
sys     0m0.170s

PHP 5.6 ist also leicht schneller als PHP 5.5, aber zu PHP 7 ist es immer noch ein richtig großer Unterschied.

Written by Michael Kliewe

Januar 21st, 2015 at 12:56 pm

Posted in PHP

Tagged with , , ,

Den aktuellen Stand von PHP 7 (pre-alpha) selbst kompilieren und testen

without comments

PHP 7 wird kommen, nach aktuellem Plan wird es Mitte Oktober 2015 soweit sein. Ich persönlich bin da noch etwas skeptisch ob das zeitlich klappen kann, aber ich hoffe dass es noch 2015 sein wird.

PHP 7 wird sehr große interne Änderungen an der Zend Engine mit sich bringen, die Performance wird ungefähr verdoppelt und dann auf dem Niveau von HHVM sein. Aber auch der Arbeitsspeicherbedarf wird radikal reduziert. Genau um letzteres zu prüfen habe ich den aktuellen PHP 7-Stand selbst kompiliert, und möchte hier zeigen dass es sehr einfach geht und ihr das auch machen solltet!

Wir werden PHP 7 aka phpng direkt aus dem GIT-Repository holen und kompilieren, folgende Schritte sind dazu nötig:

cd /tmp/
git clone https://github.com/php/php-src.git
cd php-src
./buildconf
./configure --prefix=/usr/local/phpng --with-zlib --with-config-file-path=/usr/local/phpng/etc --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --enable-zip --with-imap --with-kerberos --with-imap-ssl --with-openssl --with-jpeg-dir --with-gd --with-gettext --with-freetype-dir --enable-ftp --with-pspell --with-curl
make
make test

Falls es Fehler beim configure bzgl. re2c oder bison gibt, unter Ubuntu installiert man diese folgendermaßen:

sudo apt-get install bison
sudo apt-get install re2c

Falls pspell nicht gefunden werden kann:

configure: error: Cannot find pspell
sudo apt-get install libpspell-dev

Nach dem “make test” ist PHP 7 auf Kommandozeilenebene nutzbar:

$ sapi/cli/php -v
PHP 7.0.0-dev (cli) (built: Jan 20 2015 23:13:58)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

Wer PHP danach richtig installieren möchte macht noch ein “sudo make install”, dann wird PHP im oben definierten Prefix-Verzeichnis installiert.

Ich bin mir sehr sicher dass ich Mitte des Jahres, wenn es die ersten Alpha- und Beta-Versionen gibt, ausgiebig Applikationen testen werde, damit möglichst wenige Bugs in PHP 7 drin sind, und es hoffentlich bereits Ende 2015 auf Produktionsmaschinen einsetzbar sein wird. Ich sage schonmal voraus dass ich dann breit grinsend vor den Maschinen hocken werde und die neuen schnellen Webseiten und Scripte bewundern werde ;-)

Im nächsten Blogartikel geht es um meinen kleinen Vergleich des Memory-Verbrauchs.

Written by Michael Kliewe

Januar 21st, 2015 at 12:54 pm

Posted in PHP

Tagged with , , , ,

SSLv3: Uralt, bröckelig, abschalten!

with 6 comments

[EDIT] Tja, da schreibt man gerade drüber und ein paar Minuten später wird die Lücke veröffentlicht: Poodle . Details im Google Blog. Das Problem liegt im SSLv3 Protokoll selbst, es wird keine Patches geben, es muss ausgeschaltet werden. Eigentlich wäre nur uralt-Software wie der IE6 unter WindowsXP betroffen, aber durch Downgrade-Attacken die bei TLS möglich sind, sind alle betroffen und können auf das schwache SSLv3 downgegraded werden wenn es denn auf Server+Client unterstützt wird. Also abschalten!

Seit 2 Tagen gibt es Gerüchte über eine kritische Lücke in SSLv3. Aktuell (Mitternacht) ist noch nichts publik geworden außer ein eventuell interessanter Patch von Microsoft, und eine Falschmeldung eines OpenBSD-Patches, der in Wirklichkeit schon einige Monate alt ist.

Sicher ist dass SSLv3 18 Jahr alt ist, und vor 15 Jahren durch TLSv1.0 abgelöst wurde. Bei mail.de haben wir SSLv3 bereits vor einigen Monaten deaktiviert auf den Webseiten da kaum ein Client dieses alte Protokoll benutzte außer der IE6 auf WindowsXP Systemen. Da wir den IE6 eh schon lange nicht mehr unterstützen war es sehr einfach, SSLv3 abzuschalten.

Für die anderen Protokolle wie IMAP, POP3 und SMTP haben wir SSLv3 allerdings noch aktiviert gelassen da es noch diverse E-Mail-Clients gibt die TLS >1.0 noch nicht beherrschen. Auch einige ältere Smartphones beherrschen noch kein TLS1.0 oder neuer, sodass es Sinn machte es noch aktiviert zu lassen, denn es gab auch (noch) keine bekannten Angriffsvektoren.

Weiterlesen »

Written by Michael Kliewe

Oktober 15th, 2014 at 12:18 am

Wer nutzt die ungewöhnlichen PHP-Tags?

with 23 comments

Vorgestern begann eine interessante Diskussion inklusive eines RFC in der PHP-Internals-Mailingliste, in der es um die Abschaffung zweier alter und selten genutzter Möglichkeiten geht, PHP-Code als solchen zu markieren. Normalerweise beginnt PHP-Code mit <?php oder <?

Es gibt aber weitere Möglichkeiten für diesen Einsatzzweck:

<script language="php">
    echo 'Hallo';
</script>

<% echo 'Hallo'; %>

php_tagsNun ist die Frage: Soll bzw. kann man diese alternativen Tags aus der PHP-Engine entfernen? Ein Gegenargument wäre dass durch die Entfernung plötzlich der PHP-Quelltext an den Browser ausgegeben würde, ein Besucher der Webseite würde also den möglicherweise geheimen Sourcecode mit Passwörtern usw. zu Gesicht bekommen. Ist das eine reelle Gefahr die die Abschaffung für immer oder mindestens lange Zeit verhindert? Oder betrifft das nur ein paar hundert weltweit genutzte kleine Webseiten, auf die man keine Rücksicht nehmen kann?

Welche Vorteile hätte eine Entfernung, bringt es neben dem verringerten PHP-Engine-Code auch kleine Performancevorteile oder ähnliches?

In welcher Version sollte man diese Tags als DEPRECATED markieren, um so die Admins auf die nahende Entfernung hinzuweisen? Wie viele Admins oder Programmierer bekommen die DEPRECATED-Meldungen im Error-Log überhaupt mit?

Wer von euch nutzt diese ungewöhnlichen Methoden in seinem Code oder hat ihn bereits in Fremdcode oder Bibliotheken gesehen? Ich muss zugeben dass ich von den beiden Möglichkeiten in den letzten 10 Jahren nichts gehört habe und nicht wußte dass sie existieren, und sie demnach auch noch nie irgendwo gesehen habe…

Written by Michael Kliewe

September 12th, 2014 at 11:37 am

Posted in PHP

Tagged with , ,

PHP 5.6.0 released! Neue Funktionen

with 6 comments

Vor ziemlich genau einer Stunde ist PHP 5.6 final erschienen, und es ist Zeit sich die neuen Features und Vorteile anzuschauen. Aus meiner Sicht lohnt ein Upgrade, allein schon wegen der geschenkten 10% Performance gegenüber PHP 5.5.

Die neue Version kann auf der Downloads-Seite von php.net heruntergeladen werden. Die neuen Features sind die folgenden:
Weiterlesen »

Written by Michael Kliewe

August 28th, 2014 at 3:44 pm

Posted in PHP

Tagged with , ,