Archive for the ‘PHP 5.5’ tag
Verteilung der PHP-Versionen, Verbreitung von 5.5
Da PHP 5.6 vor der Tür steht (die Beta müßte jeden Tag erscheinen, und die finale Version dann in einigen wenigen Wochen) fragte ich mich wie es mit der PHP 5.5 Verbreitung aussieht, immerhin ist 5.5 bereits am 20. Juni 2013 veröffentlich worden, also vor fast 10 Monaten. Bei mail.de sind wir erst Anfang Februar auf 5.5 umgestiegen, wir nutzen keine Software im Produktivbetrieb kurz nachdem sie released wurde und warten immer ein paar Wochen ab bis die ersten Bugfix-Releases erschienen sind. Wenn Zeit da ist versucht man sich bereits vorher an einer Testumgebung, aber diesmal fehlte die Zeit dies ausführlich machen zu können Mitte des Jahres. Ende des Jahres hatten wir so viel um die Ohren sodass wir erst Anfang dieses Jahres dazu gekommen sind.
Je größer die Umgebung, je umfangreicher die Applikationen und je mehr unterschiedliche Projekte mit externen Abhängigkeiten man hat, desto aufwändiger sind die Tests und die Änderungen die man machen muss. Mit der Version 5.5 gab es kaum Änderungen an Funktionen um die man sich kümmern muss wie man im Migration Guide 5.5 lesen kann. Wichtig sind vor allem die Backward Incompatible Changes, die Deprecated Features und die Changed Functions. Für uns jedoch war die wichtigste Änderung die Einführung des OpCache, der ehemals als Zend Optimizer+ bekannte Bytecode-Cache der nun mit PHP ausgeliefert wird. Wir nutzten bis dahin seit Jahren APC als Bytecode-Cache und auch als lokalen Usercache. Nun wechseln wir weg von APC hin zu OpCache und APCu. Da wir dort die meisten Probleme erwarteten mußten wir dies besonders gut testen, denn in den letzten Monaten sind noch einige kleine Bugs in APCu aufgetreten.
Bug bei Authentifizierung in curl
curl hat in der aktuell verwendeten Version im stabilen Ubuntu 13.10 einen Bug, der sich auch rein bis in die PHP-Scripte auswirkt.
Wenn man bei der Nutzung von curl die Authentifizierung nutzt und im Passwort ein Semikolon enthalten ist (was gute Passwörter ja so an sich haben), dann wird dieses Passwort abgeschnitten. Folgender Beispielcode:
$curlSettings[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC; $curlSettings[CURLOPT_USERPWD] = '1testuser' . ':' . 'pass;word'; $curl = curl_init('https://www.phpgangsta.de/download/curl_auth_test.php'); // content: echo 'Password: '.$_SERVER['PHP_AUTH_PW']; curl_setopt_array($curl, $curlSettings); curl_exec($curl); // should output: Password: pass;word // wrong output: Password: pass
Es wird mittels des curl-Parameters CURLOPT_USERPWD der Username und das Passwort übertragen, und wie man an der Antwort des Servers sieht kommt nur das Passwort bis zum Semikolon beim Server an, es wird abgeschnitten.
APCu: Der neue User-Cache
Speziell für PHP 5.5 gibt es die User-Cache-Extension APCu: Seit PHP 5.5 ist der Bytecode-Cache OpCache enthalten, die bisher genutzte Extension APC wird dann nicht mehr benötigt. Doch wer APC nicht nur wegen seiner Bytecode-Cache-Fähigkeit installiert sondern auch die User-Cache-Funktionen genutzt hat, kann jetzt die abgespeckte Erweiterung APCu nutzen, in der alle Bytecode-Funktionen entfernt wurden.
(Wer die Upload-Progress-Funktionen von APC genutzt hat, kann nun die eingebauten Session-Upload-Progress-Funktionen nutzen, aber das ist ein anderes Thema)
Die relativ schlanke Extension APCu (GitHub-Repository), in der nur noch die übrig gebliebenen Funktionen wie z.B. apc_store() und apc_fetch() enthalten sind, wurde dann noch etwas verbessert. Vorher war das unmöglich da die komplizierte große APC-Extension nur schwer wartbar war.
Die Version 4.0.1 von APCu sollte unbedingt vermieden werden da sie nicht APC-kompatibel ist, es gab da einen Bug. Also 4.0.0 oder besser >=4.0.2 verwenden. Die Installation ist denkbar einfach. Falls PHP 5.5 über das Paketmanagement von Ubuntu installiert wurde reicht ein einfaches:
sudo apt-get -V install php5-apcu
Oder via PECL installieren:
undefined function json_encode(): Distributionen tauschen JSON Extension
Letzte Woche habe ich zum ersten Mal folgende Fehlermeldungen gesehen:
PHP Fatal error: Call to undefined function json_decode() PHP Fatal error: Call to undefined function json_encode()
Diese Fehler kommen nach dem Upgrade auf PHP 5.5 unter Ubuntu 13.10. Doch warum kommt der Fehler, JSON ist doch schon seit langen Jahren (PHP 5.2) fest in PHP eingebaut? Auf der Suche nach der Lösung stösst man dann auf die folgenden Sätze:
– The Software shall be used for Good, not Evil.
– The freedom to run the program for any purpose.
Der erste Satz steht in den Lizenzbedingungen der JSON-Extension, die Teil des PHP-Kerns und eine C-Library vom Javascript-Guru und JSON-Erfinder Douglas Crockford ist.
Der zweite Satz stammt aus dem sogenannten „freedom 0“ der Free Software Foundation (FSF), den sehr viele große Distributionen unterstützen und übernehmen.
OpCache in PHP 5.5
Ende Januar wurde es von Zeev Suraski, dem Chef von Zend, angekündigt und am 13. Februar in die Tat umgesetzt: Der Quellcode des Opcode Caches von Zend mit dem Namen Optimizer Plus wurde auf GitHub veröffentlicht und unter die PHP-Lizenz gestellt, mit dem Ziel es in den PHP-Kern einzubauen. Der Zeitplan war aber sehr problematisch, denn eigentlich war für März die neue PHP-Version 5.5 geplant. Doch der Code ist bereits seit Jahren im Closed-Source-Einsatz bei Zend, ziemlich stabil, und es wäre das neue Feature in der neuen Version.
Release und Voting
Doch dafür muss der jährliche Release-Zyklus gedehnt und das Release um wenige Monate verschoben werden. Die Diskussion ging einige Wochen, auch bereits vor der eigentlichen Veröffentlichung, und ein Voting im RFC sollte entscheiden. Doch auch das Voting war problematisch, denn es gab 3 Möglichkeiten: Release mit PHP 5.5 incl. Verzögerung von wenigen Monaten, Release mit PHP 5.5 nur ohne Verspätung sprich 5.6, und die dritte Möglichkeit war keine Integration in den Kern.