Logbuch. Lohnt sich ein Umstieg auf PHP7? Übergang zu PHP 7

Guten Tag, liebe Leser und Abonnenten, viele von Ihnen haben wahrscheinlich die Information gehört, dass die Suchmaschine Google große Anstrengungen unternimmt, um alle Websites im Internet auf eine sichere https-Verbindung zu übertragen, indem sie Verschlüsselungszertifikate für Websites installiert und Webmastern anbietet, Boni zu erhalten in den Suchergebnissen, sofern alle anderen Bedingungen gleich sind. Deshalb habe ich ernsthaft über diese Aufgabe nachgedacht und geplant, die Website dorthin zu verlegen Sommerzeit, aber vor dieser Aufgabe muss ich alles vorbereiten und einer der Vorbereitungsschritte, die ich mir vorgenommen habe, ist der Übergang von PHP 5 zu PHP 7 auf meinem Hosting mchost.ru

Warum muss ich von PHP 5 auf PHP 7 umsteigen?

Zwei Dinge haben mich dazu veranlasst:

  • Ich bekomme mehr Funktionalität ab PHP 7
  • Ich entlaste meine Ressourcen und reduziere die Anzahl der Anfragen, wodurch ich die Ladegeschwindigkeit der Website erhöhe, was jetzt für mobile Suchergebnisse sehr wichtig ist, deren Prozentsatz bereits 50 Prozent überschritten hat.

Ich habe Ihnen bereits im Artikel beschrieben, wie meine Website unter der Last des Parsens verbogen wurde, und der technische Support empfahl nach der Lösung der Probleme auch, da die Website PHP 7 unterstützt, darauf umzusteigen. Tests zum Vergleich der Leistung von PHP 5 und PHP 7, siehe Link.

PHP-Version ändern

Da ich VPS-Hosting auf mchost habe, geht das ganz einfach. Wir gehen zu Ihrem persönlichen Konto unter https://cp.mchost.ru/login.php. Als nächstes sollten Sie, wie jeder normale Mensch, eine Sicherungskopie der Site erstellen. Wir gehen zum Backup-Element, wählen die Site aus und erstellen sie.

Der nächste Schritt besteht darin, Websites auszuwählen. Finden Sie unter ihnen diejenige, die Sie benötigen, und klicken Sie auf PHP-Einstellungen.

Im PHP-Eintrag für die Domain sehen Sie eine Liste möglicher Versionen, aktuell ist FastCGI PHP 7.1 die neueste

Der Umstellungsprozess von PHP 5 auf PHP 7 beginnt. Auf der rechten Seite wird ein Fortschrittsbalken angezeigt.

Wie Sie sehen können, hatte ich vor dem Versionswechsel 5.4.45

Schauen wir uns jetzt 7.1 an

Ich möchte darauf hinweisen, dass die Übersetzung selbst zwischen den Versionen bis zu 15 Minuten dauern kann, daher ist es besser, diese Aktion auf den Abend zu verschieben

Wenn Sie übrigens 3 Monate lang kostenlos von diesem Hosting profitieren möchten, klicken Sie auf das Banner unten und nehmen Sie teil Aktionscode 48C4-D018-AC60-50C6

Nachdem Sie die Site auf die neueste Version übertragen haben, überprüfen Sie die gesamte Funktionalität Ihrer Ressource, ob alles funktioniert und korrekt angezeigt wird. Wenn nicht, haben Sie zwei Möglichkeiten: 1 ist ein Rollback und die zweite ist die Änderung der Site.

Mögliche Probleme

Es kann vorkommen, dass Sie eine Fehlermeldung erhalten: Fehler beim Herstellen einer Verbindung zur Datenbank

Die Lösung ist einfach: Sie müssen das Passwort für die Datenbank in Ihrem persönlichen Konto aktualisieren. Wählen Sie Datenbanken aus und klicken Sie auf die gewünschte Datenbank (bearbeiten).

Setzen Sie das Passwort zurück.

Wenn Sie sich zum Beispiel nicht an das Passwort dafür erinnern und eine Site-Engine wie ich, WordPress, haben, können Sie eine Verbindung zum FTP-Server herstellen und die Datei wp-config.php im Stammverzeichnis der Site finden

Öffnen Sie es und suchen Sie das Feld (MySQL-Datenbankkennwort).

Wenn Sie weitere Probleme haben, schreiben Sie diese in den Kommentaren und wir werden versuchen, sie gemeinsam zu lösen. Seien Sie also nicht zu faul, diese Aufgabe zu erledigen. Es ist wichtig, alle Funktionen der neuesten Software zu nutzen, zumal Sie auch den Vorteil einer geringeren Belastung des Hostings und einer höheren Geschwindigkeit Ihrer Ressource erhalten.

Lohnt sich ein Upgrade auf die neue Version von PHP 7.0? - Es lohnt sich auf jeden Fall, denken Sie nicht einmal darüber nach – machen Sie weiter!

Die siebte Version weist einige Neuerungen auf. Die wichtigsten:

  1. PHP 7 Core verwendet PHPNG. Der neue Kern verleiht Websites eine Leistungssteigerung von 40 %;
  2. Geben Sie Hinweise und Rückgabewerte ein. Wenn Sie nun eine Funktion deklarieren, können Sie für jede Variable einen eigenen Typ sowie den Datentyp angeben, den die Funktion zurückgibt. Verfügbare Typen: int, float, string und bool;
  3. kombinierter Vergleichsoperator und vieles mehr.

Erweiterungen wurden in PHP 7 entfernt:

  • MySQL

Entfernte Erweiterungen befanden sich seit langem im Status „veraltet“; ihre Verwendung führte dazu, dass eine Warnung auf dem Bildschirm angezeigt wurde. Anstelle von „mysql“ müssen Sie „mysqli“ oder „pdo_mysql“ verwenden und anstelle von „ereg“ => „preg_*“.

Mehr über die neuen PHP 7-Produkte erfahren Sie auf der offiziellen Seite.

Lohnt sich ein Upgrade auf PHP 7?

An dieser Moment Der einfachste Weg, die Leistung Ihrer Website zu verbessern, ist ein Upgrade auf PHP 7.0.x. Geschwindigkeitsgewinne hängen auch davon ab, wie Ihr Projekt geschrieben ist. Wenn Sie immer noch Zweifel haben, zeigen wir Ihnen einige Vergleiche:

Benchmarks PHP 5.6 vs. PHP 7 für einige Frameworks und CMS (Zend-Framework, Magento, Drupal, Mediawiki, WordPress, Laravel, SugarCRM usw.):

Für alle Frameworks ist der Leistungsgewinn erheblich. Schauen wir mal, wie es mit den Kernel-Funktionen und -Konstrukten aussieht:

Wenn Sie die Grafiken überzeugen, können Sie versuchen, Ihre Website auf eine neue PHP-Version zu migrieren und die Vorteile bei einem echten Projekt zu spüren.

Wählen Sie beim Erstellen eines Knotens „Blau“ in der Liste der Server aus, damit der Knoten auf einem Server mit PHP 7 erstellt wird.

So zeigt sich 1c Bitrix auf Basis eines SSD-Laufwerks und PHP 7.0

1. Januar 2016

PHP 7.0.0 wurde bereits im Dezember 2015 veröffentlicht, aber die Frage der Umstellung auf diese Version beschäftigt die fortschrittliche Jugend immer noch. Kein Wunder, denn jedes bedeutende PHP-Release bringt viele nützliche Neuerungen mit sich.

Warum aktualisieren?

Leistung

Es gibt viele synthetische und echte Tests Leistung verschiedener PHP- und HHVM-Versionen, die nur eines sagen: Mit jeder PHP-Version wird das Web immer schneller. Die meisten meiner Projekte laufen auf MODX Revolution und CodeIgniter 3. Und natürlich war ich neugierig, was sich nach dem Wechsel der PHP-Version ändern würde.

MODX Evolution

Natürlich könnte ich die Leistungsänderung für MODX Evolution überprüfen, aber in diesem System gibt es eine Menge Code, der, wie ich oben geschrieben habe, von Remote-PHP-Erweiterungen abhängt. Allerdings bietet die vom Benutzer erstellte Version jetzt volle Unterstützung für PHP 7.

MODX-Revolution

Also habe ich mehrere Websites mit PHP 5.6 erstellt. Normalerweise messe ich die Anzahl der Anfragen und die Zeit, die zum Generieren einer Seite benötigt wird. Es ist logisch anzunehmen, dass die Anzahl der Anfragen kaum mit der PHP-Version zusammenhängt, aber es wäre nicht überflüssig, diese Informationen hinzuzufügen. Ab der Version wurde volle Kompatibilität mit PHP 7 implementiert. Davor gab es nur teilweise Unterstützung für PHP 7, weshalb das Admin-Panel bei mir nicht funktionierte, obwohl die Seite selbst einwandfrei funktionierte.

Standort Nr. 1

PHP-Version Caching Anfragen Zeit, s
5.6 156 1.18
5.6 17 0.25
7 161 0.43
7 17 0.02

Standort Nr. 2

Standort Nr. 3

Wie Sie sehen, wirkte sich der Wechsel der PHP-Version auf die neueste Version positiv auf die Leistung der Website aus und steigerte sie um das 1,5- bis 3-fache und an einigen Stellen (z. B. auf der Hauptseite meiner Website) sogar um das Zehnfache.

CodeIgniter 3

Ich kann mich nicht mit einer großen Anzahl von Projekten auf CodeIgniter rühmen, aber selbst bei ihnen muss ich besonders auf die Produktivität achten, da die Anzahl der Artikel und einzelnen Besucher pro Monat bei einem von ihnen in die Tausende geht. Eines davon optimiere und refactoriere ich gerade, wobei auch ohne den Umstieg auf PHP 7 die Performance an manchen Stellen um ein Vielfaches gestiegen ist. IN bald Wenn ich mit meiner aktuellen Arbeit fertig bin, werde ich auf jeden Fall über die Ergebnisse der Versionsänderung schreiben.

Syntax

An der Syntax wurden einige Änderungen vorgenommen, die sich auf die Abwärtskompatibilität auswirken. Zusätzlich zur offiziellen Dokumentation empfehle ich Ihnen, Codebeispiele auf GitHub zu studieren, zum Beispiel diese: .

Wer sollte nicht aktualisieren?

Diejenigen, deren Projekte auf Erweiterungen basieren, die im neuen PHP entfernt wurden, sollten nicht aktualisieren. Es lohnt sich auch, im Internet nach Informationen zu geringfügigen Syntaxänderungen zu suchen, da es Punkte gibt, die gegen die Abwärtskompatibilität verstoßen. Natürlich kommen solche Fälle nur einer von tausend vor, wenn nicht sogar seltener, aber es ist besser, auf der sicheren Seite zu sein.

Hosting-Anbieter

Die Veröffentlichung von PHP 7 erfolgte erst vor relativ kurzer Zeit, daher bieten nicht alle Hosting-Anbieter die Möglichkeit, das neue Produkt auszuprobieren. Mit beget können Sie beispielsweise bereits die Geschwindigkeit genießen, aber timeweb hält PHP 7 wahrscheinlich für nicht stabil genug.

Die Erfahrung eines anderen

Abschluss

Zum Umschalten auf letzte Version PHP hat mehr Vor- als Nachteile. Wenn Sie eine einfache Optimierung wünschen, aktualisieren Sie daher PHP.

Vor ein paar Tagen habe ich meinen Server mit etwa 30 Seiten auf PHP 7 umgestellt. Einige davon waren recht alt und bestanden aus einer Vielzahl unterschiedlicher Frameworks und CMS. Hier einige Tipps für diejenigen, die sich noch nicht entschieden haben, ob sie auf PHP 7 umsteigen sollen oder nicht.

Beginnen wir mit der Tatsache, dass ich verstehe, dass es viele Leute gibt, die die stabile Version erst dann als wirklich „stabil“ betrachten, wenn sie ein wenig ausgereift ist, und erwarten, dass es noch einige Fehler oder Inkompatibilitäten geben wird. Nach dem, was ich bisher gesehen habe, als ich jeden Release-Kandidaten ausprobiert habe, sobald er veröffentlicht wurde, ist es völlig sicher, sofort nach seiner Veröffentlichung auf PHP 7 umzusteigen. Ich habe noch nie ein seltsames Verhalten oder einen Absturz bemerkt, der nicht meine Schuld war. Trotz der Tatsache, dass dies eine neue Version Es enthält nicht viele inkompatible Änderungen, das heißt, Sie können es im Großen und Ganzen wie PHP 5.7 behandeln, nur viel schneller.

Und die Geschwindigkeit ist wirklich beeindruckend, ja unglaublich. Beispielsweise arbeitete eine einfache Site auf PHPixie fast dreimal schneller und erreichte fast die Geschwindigkeit von Phalcon auf PHP 5.6, mehrere Sites auf Wordpress zeigten eine stabile Geschwindigkeitssteigerung um den Faktor zwei. Wenn Sie den aktuellen Bericht von Google bedenken, dass selbst ein 10-prozentiger Verlust der Seitenladeleistung zu einem erheblichen Kundenverlust führt, dann erzielen Sie mehr Verkäufe, ohne etwas auszugeben, wenn Sie Ihre Website einfach um die Hälfte beschleunigen können, indem Sie einfach PHP aktualisieren. Denken Sie daran, wenn Sie Ihren Vorgesetzten davon überzeugen, auf PHP 7 umzusteigen. Nichts überzeugt mehr als der Umsatz.

Ein paar Anmerkungen

Verlängerung MySQL ist nicht mehr verfügbar, falls Sie also noch nicht zu gewechselt haben gU oder mysqli dann musst du es jetzt unbedingt tun. Glücklicherweise reicht es in vielen Fällen aus, einfach die Anrufe zu ersetzen mysql_ Funktionen auf mysqli_.

E_STRICT Fehler werden in andere Fehlertypen umklassifiziert. Wenn Sie sie zuvor versteckt oder ignoriert haben, werden sie jetzt zusammen mit anderen auftauchen. Beispielsweise führt der statische Aufruf nicht-statischer Methoden jetzt zu Auslösungen E_DEPRECATED was zu einer Reihe von Problemen mit Joomla 2.5 führte, was aus irgendeinem Grund ziemlich häufig vorkommt. Auch inkompatible Vererbung wird jetzt als klassifiziert E_WARNUNG. Wordpress wurde seit Februar auf PHP 7 getestet, es gibt also keine Probleme damit, allerdings erwiesen sich mehrere Plugins als inkompatibel.

für jede Funktioniert jetzt immer mit einer Kopie des Arrays, sodass Änderungen am Array während einer Iteration keinen Einfluss auf die Iteration selbst haben. Tatsächlich hat es in vielen Fällen trotzdem funktioniert und der Fall selbst ist ziemlich selten, aber ich bin trotzdem in einem der Plugins darauf gestoßen.

Jetzt $foo->$bar["baz"] Interpretiert als ($foo->$bar)["baz"] und nicht $foo->($bar["baz"]) wie in PHP 5. Dies ist ein seltener Fall, aber es passierte auch in einem der Plugins, und wie sich herausstellte, in Magento 1.x ( core/Mage/Core/Model/Layout.php).

Bedenken Sie, dass nicht mehr alle Erweiterungen PHP 7 unterstützen. Ich kann meinen Lieblings-XCache, der mir viele Jahre lang gute Dienste geleistet hat, nicht mehr verwenden.

Insgesamt habe ich etwa 5 Stunden gebraucht, um alle Seiten auf PHP 7 zu übertragen. Der Vorgang ist überhaupt nicht schwierig und es sind bereits Pakete für alle gängigen Distributionen verfügbar. Selbst wenn Sie also auf eine stabile Version warten (nicht mehr lange), gibt es keinen Grund, Ihre Websites nicht frühzeitig auf die Migration vorzubereiten.

Sie haben also eine alte, aber sehr liebe Website, die Sie aus Mitleid (oder vielleicht nach erneutem Lesen von Habr) für die Umstellung auf PHP7 entscheiden. In der gespannten Erwartung einer dramatischen Leistungssteigerung entstauben Sie Ihre schlechte Website und stellen entschieden die PHP-Version in Ihrem Hosting-Kontrollpanel um.

Wenn die Seite nicht mehr jung ist, wird mit hoher Wahrscheinlichkeit kein Wunder geschehen. Im besten Fall treten alle möglichen Fehler auf, im schlimmsten Fall sehen Sie einen weißen Bildschirm, den Höhepunkt der Webentwicklung. In diesem Moment möchten Sie schnell alles umstellen und Ihre plötzliche Schwäche vergessen.

Aber nehmen wir an, dass Ihr starker Punkt- Ausdauer, und Sie haben auch etwas Zeit zum Experimentieren. Versuchen wir, alles in Ordnung zu bringen.

Backups

Wir erstellen Sicherungskopien der Site (und gleichzeitig der Datenbanken). Schließlich ist jeder, der keine Backups erstellt, sein eigener Feind, oder? Für verschiedene Arten von Experimenten ist es sinnvoll, eine weitere Site auf dem Hosting hinzuzufügen und die Dateien, die wir jetzt bearbeiten werden, dorthin zu kopieren.

Fehlerprotokolle

Lassen Sie uns die PHP-Fehlerprotokollierung in der .htaccess-Datei konfigurieren (sofern sie noch nicht konfiguriert wurde):

php_value display_errors 0
php_value log_errors 1
php_value error_log /home/vasya/domains/mysite.ru/logs/error.log

Arbeiten mit MySQL

Nehmen wir an, die Website verwendet Datenbanken und Sie sehen Fehler wie diesen:

Schwerwiegender Fehler: Nicht erfasster Fehler: Aufruf der undefinierten Funktion mysql_connect()

Dies liegt daran, dass in modernen PHP-Versionen (ab PHP 5.5.0) die ursprüngliche MySQL-Erweiterung nicht unterstützt wird. Die Entwickler empfehlen die Verwendung von MySQLi oder PDO. Versuchen wir, auf MySQLi umzusteigen. Es ist ganz einfach:

Nehmen wir an, dass die Website mit einem prozeduralen Ansatz geschrieben wurde, was klassischer Scheißcode ist und von vielen mittlerweile als prägnante und effektive Lösung angesehen wird. In diesem Fall das folgende Legacy-Konstrukt für die Verbindung zur Datenbank:

$link = mysql_connect('localhost', $user, $password)
mysql_select_db($dbname, $link)
mysql_query('Namen festlegen cp1251')

kann ersetzt werden durch:

$link = mysqli_connect('localhost', $user, $password, $dbname)
mysqli_query($link, ‚Namen festlegen cp1251‘)

für Rückfragen:

$result=mysql_query($query,$cid)

ersetzt durch:

$result=mysqli_query($cid, $query)

Andere beliebte Funktionen können leicht in ihre „i“-Gegenstücke geändert werden:

mysqli_fetch_array()
mysqli_fetch_row()
mysqli_fetch_assoc()
mysqli_fetch_array()
mysqli_num_rows()
mysqli_insert_id()
mysqli_close()

Als Ergebnis dieser einfachen Schritte sollten Daten aus der Datenbank erfolgreich erfasst und gesendet werden.

Codierung

Echt altmodisch ist (zumindest) die Seite in CP1251. Hat sich alles in Diamanten oder andere Ziegen verwandelt?

Höchstwahrscheinlich reicht es aus, die Kodierung in .htaccess wie folgt anzugeben:

php_value default_charset „cp1251“

Reguläre Ausdrücke

Möglicherweise werden Ihnen auch Fehler der folgenden Art angezeigt:

Warnung: preg_replace(): Der Modifikator /e wird nicht mehr unterstützt. Verwenden Sie stattdessen preg_replace_callback

Das bedeutet, dass der Modifikator /e, mit dem Sie das Ergebnis eines regulären Ausdrucks an eine beliebige Funktion übergeben konnten, nicht mehr unterstützt wird. In solchen Fällen wird empfohlen, die Funktion preg_replace_callback zu verwenden

Nehmen wir an, wir haben einen regulären Ausdruck wie diesen:

$string=preg_replace(“/:((1,10)):/e“, „print_smile(‘\\1’)“, $string)

mit einem Ersatz für preg_replace_callback sollte es so aussehen:

$string=preg_replace_callback(“/:((1,10)):/“, create_function(‘$matches’, ‘return print_smile($matches)’), $string)

Hier ist alles einfach, als erstes Argument wird nun der reguläre Ausdruck angegeben (natürlich ohne den Modifikator /e) und als zweites Argument wird eine anonyme Funktion (die nach Anwendung des regulären Ausdrucks ausgeführt wird) mit zwei Argumenten angegeben : das $matches-Array, in dem die Daten gespeichert werden, mit dem regulären Ausdruck übereinstimmen und eine externe Funktion mit Argumenten aufrufen. In diesem Beispiel heißt die externe Funktion print_smile und das erste gefundene Vorkommen wird ihr als Argument übergeben. Was \\1 in preg_replace war (das erste gefundene Vorkommen), wird zu $matches (wenn es mehr Argumente gab, dann gibt es $matches, $matches usw.).

Hier ist ein weiteres, komplizierteres Beispiel:

Es war so:

$out=preg_replace(“/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/es", "feed_out_sub_rm('\\2′,'$base_prefix','$nick','$id_entry')", $out)

Es wurde so:

$out=preg_replace_callback(‘/<(=[\’\»]{0,1}|)(.*?)([\’\»]{0,1})>(.*?)<\/>/s', create_function('$matches', 'return feed_out_sub_rm($matches, "'.$base_prefix.", "'.$nick.", "'.$id_entry.") '), $out )

Bei Anführungszeichen kommt man hier leicht durcheinander, seien Sie vorsichtig.

Wenn wir uns mit regulären Ausdrücken befassen, können wir uns an zwei weitere Funktionen erinnern, die seit PHP 5.3.0 als veraltet gelten (und nicht unterstützt werden). Die Symptome sind wie folgt:

Schwerwiegender Fehler: Nicht erfasster Fehler: Aufruf der undefinierten Funktion ereg_replace()

Wenn der reguläre Ausdruck in ereg_replace einfach ist, können Sie ihn erhalten, indem Sie einfach die Grenzzeichen wie folgt festlegen:

$str=ereg_replace("[\r\t\n]", "",$str)
$str=preg_replace(“/[\r\t\n]/“,“,,$str)

Ähnliches Symptom:

Schwerwiegender Fehler: Nicht erfasster Fehler: Aufruf der undefinierten Funktion split()

$var_pair=split("=",$tmp)

$var_pair=explode("=",$tmp)

Wenn der reguläre Ausdruck komplexer ist, versuchen wir, ihn in preg_split umzuwandeln.

Wenn etwas nicht klappt oder Ihr Fall unseren Beispielen überhaupt nicht ähnelt, schreiben Sie Kommentare und wir werden versuchen, es gemeinsam herauszufinden.

Um Kommentare zum Beitrag zu hinterlassen, melden Sie sich mit Ihrem Konto bei den sozialen Netzwerken VKontakte/FaceBook oder Ihrem Google/Yandex-Konto an.

Wenn Sie einen Fehler finden, wählen Sie bitte einen Textabschnitt aus und drücken Sie Strg+Eingabetaste.