Uppgradera till PHP 7.3 för bättre prestanda och säkerhet

Publicerad: 1.8.2019 Uppdaterad: 8.7.2019

Om du idag kör WordPress på någon äldre PHP-version än 5.6 har jag dåliga nyheter: Från och med WordPress version 5.2 är 5.6.20 den lägsta PHP-versionen som WordPress stödjer. Men det är fortfarande för tidigt att pusta ut om du kör PHP 5.6 eller rentav 7.0 och webbplatsen ser ut att fungera bra. Försök att uppgradera till den senaste versionen, 7.3, så snart som möjligt, även om WordPress-core ännu inte tvingar dig till detta. I denna artikel förklarar vi både varför du ska göra detta och hur du gör.

Men min webbplats fungerar ju redan bra – varför ska jag bry mig?

Svaret på detta finns svart på vitt på webbplatsen för PHP: PHP-versioner före 7.1 erhåller inte längre några säkerhetsuppdateringar. Det innebär att säkerhetsproblem som upptäcks i programmeringsspråket PHP inte längre rättas. Detta gör din webbplats sårbar för eventuella angripare. Den 1 december 2019 slutar man även att publicera säkerhetsuppdateringar för PHP-version 7.1. Därför är det mycket god idé att gå över till 7.3, den senaste PHP-versionen.

Om det skulle vara så att du fortfarande använder en äldre PHP-version än 7.0 innebär dessutom ett byte till PHP 7 att din webbplats kan bli upp till 3–4 gånger snabbare och att en rad nya funktioner tillkommer som underlättar tillvaron för utvecklare. Vi berättade om detta i vårt blogginlägg om lanseringen av PHP 7.3.

För de verkliga PHP-nördarna kan vi berätta att PHP 7.4.0 alpha 1 nyligen släpptes den 13 juni 2019. Men än så länge handlar det om en tidig testversion som inte lämpar sig för drift i produktion. Man planerar att PHP 7.4.0 ska bli klart för allmän tillgänglighet (GA – General Availability) i slutet av november 2019, strax innan stödet för PHP 7.1 avslutas i december. Stödet för PHP 7.3 kommer att finnas kvar fram till 6 december 2021, så du behöver inte oroa dig för att stödet för det upphör alltför snart.

För att maximalt underlätta din uppgradering till PHP 7.3 har vi inkluderat ett kort exempel på hur processen går till, med en demo-webbplats.

Kontrollera vilken PHP-version du har nu

Utgångspunkten i denna artikel när du uppgraderar din PHP-version är en webbplats i produktion som kör PHP 5.6. Om du inte är säker på vilken PHP-version din webbplats kör just nu, är det god idé att börja med att kontrollera detta för att avgöra om du över huvudtaget behöver uppgradera. Kunder hos Seravo.com kan kontrollera vilken PHP-version de använder med vårt lokalt utvecklade skript wp-check-php-version som även ger information om upphörande support för PHP-versionen för den som använder en äldre version:

leotoikka@leotoikka_02d27b:~$ wp-check-php-version
 Checking for PHP backends…   
 Using default PHP mode (php5)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
 ! WARNING: PHP 5.6 is deprecated, security support has ended 31th December 2018!!   
 ! 
 !
 ! See https://seravo.com/docs/configuration/php7-hhvm/ for more details. !  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 php5

Vissa webbhotell visar denna information i en administrationspanel, exempelvis CPanel. Om du vet med dig att du kör PHP med PHP-FPM (FastCGI) kan du även kolla vilken PHP-process som körs med hjälp av följande kommando för att se versionen php-fpm med hjälp av:

leotoikka@leotoikka_02d27b:~$ ps aux | grep 'php' | grep -v grep
...
leotoik+ 17091  0.0  0.0 399804 29640 ?        Ss   10:13   0:00 php-fpm: master process (/etc/php/5.6/fpm/php-fpm.conf)
...

Tänk dig för om du får för dig att kontrollera din PHP-version via CLI med kommandot php -v eftersom PHP-installation för CLI är separat från PHP-installationen som din webbserver kör, och dessa alltså kan ha olika versioner.

Oavsett hur du kollar det, om du kommer fram till att du använder en äldre PHP-version än 7.1 bör du verkligen överväga att uppgradera till en nyare version. I de följande avsnitten går vi igenom proceduren i detalj så att du kan undvika de vanligaste problemen i denna process.

Kontrollera om du har inkompatibel PHP-kod

Vanligtvis undersöker man kompatibilitet med en PHP-version med hjälp av statisk kodanalys som utförs av olika verktyg för ”kodsniffning”. Kunderna hos Seravo.com kan använda skriptet wp-php-compatibility-check som finns tillgängligt i deras miljöer. Kommandot går att köra när man är inloggad via SSH. Ingångsparametrar för skriptet är sökvägen och PHP, och sedan kör skriptet i sin tur PHP_Codesniffer i kombination med PHPCompatibility som båda är programvara med öppen källkod. I detta fall söker vi efter eventuell inkompatibilitet med PHP 7.3 i katalogen wp-content, eftersom just den katalogen innehåller alla tillägg och teman, och vi kan utgå från att din version av WordPress-core är kompatibel med PHP 7.3. Om du kör en gammal version av WordPress-core bör du börja med att uppdatera den.

leotoikka@leotoikka_51ac74:~$ wp-php-compatibility-check
............................................................  60 / 453 (13%)
............................................................ 120 / 453 (26%)
............................................................ 180 / 453 (40%)
............................................................ 240 / 453 (53%)
.......................................................W.... 300 / 453 (66%)
......W...............W.........W..............W............ 360 / 453 (79%)
...............EE.WWW....................................... 420 / 453 (93%)
.................................                            453 / 453 (100%)



FILE: /data/wordpress/htdocs/wp-content/plugins/polylang/include/model.php
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 2 WARNINGS AFFECTING 2 LINES
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 613 | WARNING | Since PHP 7.0, functions inspecting arguments, like debug_backtrace(), no longer report the original value as passed to a parameter, but will instead provide the
     |         | current value. The parameter "$func" was used, and possibly changed (by reference), on line 576.
 630 | WARNING | Since PHP 7.0, functions inspecting arguments, like debug_backtrace(), no longer report the original value as passed to a parameter, but will instead provide the
     |         | current value. The parameter "$func" was used, and possibly changed (by reference), on line 576.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(NÅGRA FLER VARNINGAR...)


FILE: /data/wordpress/htdocs/wp-content/plugins/wp-native-dashboard/wp-native-dashboard.php
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AND 2 WARNINGS AFFECTING 4 LINES
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  90 | ERROR   | Function split() is deprecated since PHP 5.3 and removed since PHP 7.0; Use preg_split() instead
 105 | WARNING | Use of deprecated PHP4 style class constructor is not supported since PHP 7.
 541 | WARNING | Method name "wp_native_dashboard::__list_versions_by_de_de" is discouraged; PHP has reserved all method names with a double underscore prefix for future use.
 547 | ERROR   | Function split() is deprecated since PHP 5.3 and removed since PHP 7.0; Use preg_split() instead
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(NÅGRA FLER VARNINGAR...)


Time: 50.42 secs; Memory: 107Mb

Scan complete. Results are stored in the logfile /data/log/wp-php-compatibility.log

Skriptet ger information om de inkompatibiliteter det hittar gentemot PHP-versionen ifråga: filnamnet, radnumret inom filen, resultatet och ett meddelande som beskriver felet och berättar hur det kan åtgärdas. Det finns två typer av resultat i kommandots utdata: varningar (warning) och fel (error). Varningar är inte lika kritiska som fel, då de senare sannolikt får webbplatsen att åtminstone delvis sluta fungera. Till exempel anger felet Function split() is deprecated since PHP 5.3 and removed since PHP 7.0; Use preg_split() instead (Funktionen split() markerades som föråldrad sedan PHP 5.3 och togs bort ur PHP 7.0. Använd preg_split() istället) anger att ett byte till PHP-version 7.0 eller senare innebär att funktionen split() försvinner, trots att tillägget använder den, något som kommer att leda till ett allvarligt fel om den aktuella kodraden skulle köras på webbplatsen.

Var extra försiktig

Eftersom en uppgradering till ny version av programvara alltid innebär en risk att något blir fel och att webbplatsen kan komma att ligga nere rekommenderar vi starkt att du börjar med att testa uppgraderingen av PHP-versionen på någon annan server än i produktion. På detta sätt kan du undvika nedtid i produktion och helt slippa att användarna på din webbplats påverkas av detta.

I denna demonstration använder vi oss av den staging-miljö som är tillgänglig för alla kunder hos Seravo.com för att testa innan vi genomför det i produktion. Men man kan använda vilken som helst miljö som är så långt det är möjligt identisk med produktionsmiljön. Om du saknar tillgång till någon staging-miljö och om du redan har genomfört en genomsökning med avseende på PHP-inkompatibilitet utan att hitta några problem kan du gå vidare med att uppgradera PHP-versionen i produktionsmiljön med aktiverat underhållsläge.

Om du saknar tillgång till någon staging-miljö och om du redan har genomfört en genomsökning med avseende på PHP-inkompatibilitet utan att hitta några problem kan du gå vidare med att uppgradera PHP-versionen i produktionsmiljön med aktiverat underhållsläge.

För att säkerställa att miljön är identisk med nuvarande produktionsmiljö börjar vi med att återställa den till senaste status med skriptet wp-shadow-reset som är tillgängligt i alla produktionsmiljöer för kunderna hos Seravo.com:

leotoikka@leotoikka_02d27b:~$ wp-shadow-reset leotoikka_51ac74
Warning: the database and all files in /data/wordpress in shadow leotoikka_51ac74 will be deleted and replaced with a clone from production. Are you sure you want to proceed? (y/n): y
Exporting production database...
Moving database from production to leotoikka_51ac74...
Moving files from production to leotoikka_51ac74...
Importing production database to leotoikka_51ac74...
Success: the shadow leotoikka_51ac74 has been updated with production.

Innan du lämnar produktionsmiljön och går över till staging-miljön ska du göra en ny säkerhetskopia av webbplatsen i produktionsmiljön för att säkerställa att du har en reservplan om något skulle gå fel i processen:

leotoikka@leotoikka_02d27b:~$ wp-backup
--> Dumping database contents into /data/db/leotoikka_02d27b
Success: Exported to '/data/db/leotoikka_02d27b.sql'.
--> Creating backup of /data...
---> Common cache files, backups made by other software and other unnecessary files were excluded from the backup
---> Clean away old backups...
No increments older than Sun May 19 10:38:39 2019 found, exiting.
--> Backup completed
Successfully backed up 181 MB of data.
Backups at /data/backups contain now 32 increments with the oldest timestamp Mon May 20 01:03:02 2019

Lös alla kompatibilitetsproblem

Nu är det dags att gå över till staging-miljön för att lösa alla kompatibilitetsproblem. De kompatibilitetsproblem med PHP-versionen som skriptet hittade finns i tilläggen WP Native Dashboard och Polylang. Den första saken man bör kolla när man stöter på kompatibilitetsproblem med aktuell PHP-version hos tredjepartstillägg eller -teman är om det finns någon uppdatering kan lösa kompatibilitetsproblemen med nyare PHP-versioner.

Du bör aldrig modifiera filer i tredjepartstillägg eller teman direkt på din webbserver eftersom dina ändringar kommer att skrivas över nästa gång tillägget eller temat uppdateras. Istället bör du kontakta tilläggets upphovsman och berätta om problemet. Om du själv är utvecklare och tillägget du använder har öppen källkod kan du själv delta i utvecklingsarbetet genom att koda och erbjuda en programrättning för tillägget.

Du bör aldrig modifiera filer i tredjepartstillägg eller -teman direkt på din webbserver eftersom dina ändringar kommer att skrivas över nästa gång tillägget eller temat uppdateras.

Man kan snabbt och enkelt kolla om det finns en uppdatering för ett tillägg med det smidiga kommandoradsverktyget för WordPress (WP CLI) om det finns installerat på din server:

leotoikka@leotoikka_51ac74:~$ wp plugin list
+-----------------------------------+----------+-----------+---------+
| name                              | status   | update    | version |
+-----------------------------------+----------+-----------+---------+
...
| polylang                          | active   | available | 2.4.1   |
...
| wp-native-dashboard               | active   | none      | 1.3.12  |
+-----------------------------------+----------+-----------+---------+

En annan möjlighet är att använda sidan för hantering av tilläggen i WordPress adminpanel på adressenhttps://example.com/wp-admin/plugins.php. Informationen vi får från WP CLI pekar på att det verkar finnas en uppdatering för tillägget Polylang. Eftersom vi redan befinner oss i staging-miljön kan vi direkt ta och uppdatera tillägget:

leotoikka@leotoikka_51ac74:~$ wp plugin update polylang
Otetaan käyttöön ylläpitotila...
Ladataan päivitystä osoitteesta https://downloads.wordpress.org/plugin/polylang.2.5.4.zip...
Tiedoston polylang.2.5.4.zip aitoutta ei voitu todentaa koska digitaalista allekirjoitusta ei löytynyt.
Puretaan päivitystä...
Asennetaan viimeisintä versiota...
Poistetaan lisäosan vanhaa versiota...
Lisäosa päivitetty onnistuneesti.
Poistetaan käytöstä ylläpitotila...
+----------+-------------+-------------+---------+
| name     | old_version | new_version | status  |
+----------+-------------+-------------+---------+
| polylang | 2.4.1       | 2.5.4       | Updated |
+----------+-------------+-------------+---------+
Success: Updated 1 of 1 plugins.

Tyvärr finns det ingen uppdatering tillgänglig för tillägget WP Native Dashboard, eftersom det senast uppdaterades för 6 år sedan. Det finns all anledning att ersätta detta övergivna tillägg med något annat, som underhålls aktivt. Man kan söka efter en lämplig ersättare i tilläggskatalogen för WordPress (eller, om det gäller ett tema, temakatalogen för WordPress). I vårt exempelfall behöver vi inte längre behålla detta tillägg, så vi kan helt enkelt avinstallera det med kommandot wp plugin uninstall wp-native-dashboard --deactivate.

Låt oss nu köra kompatibilitetskontrollen för PHP en gång till:

leotoikka@leotoikka_51ac74:~$ wp-php-compatibility-check
............................................................  60 / 448 (13%)
............................................................ 120 / 448 (27%)
............................................................ 180 / 448 (40%)
............................................................ 240 / 448 (54%)
........................................................W... 300 / 448 (67%)
.......W...............W.........W..............W........... 360 / 448 (80%)
............................................................ 420 / 448 (94%)
............................                                 448 / 448 (100%)



FILE: /data/wordpress/htdocs/wp-content/plugins/polylang/include/model.php
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 2 WARNINGS AFFECTING 2 LINES
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 613 | WARNING | Since PHP 7.0, functions inspecting arguments, like debug_backtrace(), no longer report the original value as passed to a parameter, but will instead provide the
     |         | current value. The parameter "$func" was used, and possibly changed (by reference), on line 576.
 630 | WARNING | Since PHP 7.0, functions inspecting arguments, like debug_backtrace(), no longer report the original value as passed to a parameter, but will instead provide the
     |         | current value. The parameter "$func" was used, and possibly changed (by reference), on line 576.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(NÅGRA FLER LIKNANDE VARNINGAR...)


Time: 49.3 secs; Memory: 107Mb

Scan complete. Results are stored in the logfile /data/log/wp-php-compatibility.log

Det finns fortfarande några varningar från tillägget Polylang, men de verkar inte vara alltför allvarliga. Tillägget är ganska populärt, underhålls aktivt och tilläggets kod testas automatiskt med avseende på kompatibilitet med PHP 7.3 av Travis CI, så nu kan vi gå vidare genom att ändra den aktuella PHP-versionen till PHP 7.3 i staging-miljön, trots varningarna. Kunder hos Seravo.com hittar hjälp med hur man väljer aktiv PHP-version i vår anpassade guide. Om du har något annat webbhotell får du kolla dess dokumentation eller kontakta supportavdelningen.

Testning före uppgraderingen av produktionsmiljön

Efter att du uppdaterat din webbserver till att använda PHP 7.3 i din staging-miljö behöver du testa en del för att säkerställa att ingenting har ”gått sönder”. Du kanske vill köra eventuella acceptanstester för att vara säker på att webbplatsen fungerar som den ska. Om du är kund hos Seravo.com har du tillgång till uppsättning acceptanstester genom att helt enkelt köra kommandot wp-test.

leotoikka@leotoikka_51ac74:~$ wp-test
I: Starting wp-test-ng...
I: Using URL 'https://leot.fi' for pre-flight checks.
I: Using shadow cookie with hash 51ac74
I: Pre-flight test for https://leot.fi returned HTTP code 200
I: Executing ChromeDriver...
Starting ChromeDriver 74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}) on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
I: Ensure test user exists...
I: Updated permission and password for existing test user...
I: Running Codecept test suite 1/1..
Codeception PHP Testing Framework v3.0.0
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.
Running with seed:


Acceptance Tests (2) ---------------------------------------------------------------------------------------------------------------------------------------------------------------
⏺ Recording ⏺ step-by-step screenshots will be saved to /data/reports/tests/
Directory Format: record_5d08d112094be_{filename}_{testname} ----
✔ SeravoCheckWPHomeCest: Try to open home (3.81s)
✔ SeravoCheckWPLoginCest: Try to login and access wp admin (9.17s)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
⏺ Records saved into: file:///data/reports/tests/records.html


Time: 14.14 seconds, Memory: 16.00MB

OK (2 tests, 4 assertions)
I: Lower test user privileges as test ended...
I: Finished running wp-test-ng

Eftersom systemet för acceptanstester inte kan testa allt, måste även manuell testning utföras. Enklaste sättet att göra detta är att studera utmatningen i loggen över PHP-fel via kommandot tail -fn 0 /data/log/php-error.log och parallellt öppna olika sidor på webbplatsen.

Efter att du har kunnat bläddra igenom webbplatsens innehåll och sidor utan några fel och utan att någon funktion har gått förlorad någonstans kan du vara ganska säker på att din webbplats fungerar tillsammans med PHP-versionen 7.3. Det kan vara god idé att genomföra uppgraderingen av produktionsmiljön vid en tidpunkt med låg trafik, kanske på natten eller under tidig morgon. På det sättet bör du få ett fullt fungerande slutresultat med minimala nedtid. Du behöver inte oroa dig för att något skulle gå fel, eftersom du i så fall enkelt kan återställa säkerhetskopian du gjorde i början av proceduren.

Är du osäker på var du ska börja eller oroar du dig över att du riskerar att ha sönder något? Om du är kund hos Seravo.com behöver du inte oroa dig: våra experter genomför gärna din uppgradering av PHP-version för en kostnad av 89 € / h + moms (1-2 timmar). Skriv till oss och begär en offert: help@seravo.com.

Kommentera

Leo Toikka

Sök Seravo.se

Mer läsning

Seravo på Internetdagarna

6.12.2019

Förra veckan gick Internetstiftelsens årliga konferens Internetdagarna av stapeln på Stockholm Waterfront. Om du inte varit på den konferensen tidigare […]

Sex sätt att förbättra säkerheten med WordPress

28.11.2019

WordPress dras fortfarande med ryktet om att systemet skulle vara osäkert. Vi menar att det inte finns några osäkra WordPress-webbplatser, […]

Fem anledningar att välja WordPress

21.11.2019

Vi som befinner oss inuti ”WordPress-bubblan” riskerar lätt att stundtals uppleva allting som helt självklart. Ibland är det dock klokt […]