PHP 7.3 – parempaa suorityskykyä ja tietoturvaa

Kirjoitettu: 28.6.2019 Päivitetty: 16.7.2019

Jos WordPressisi pyörii versiota 5.6 vanhemmalla PHP:llä, meillä on sinulle huonoja uutisia: WordPressin versiosta 5.2 eteenpäin minimivaatimus PHP:lle on versio 5.6.20. Älä kuitenkaan vielä huokaise helpotuksesta, vaikka käytössäsi olisikin PHP 5.6 tai 7.0 ja sivustosi näyttäisi toimivan hyvin tällä hetkellä; suosittelemme PHP:n päivittämistä uusimpaan 7.3-versioon mahdollisimman pian, vaikka WordPressin ydin ei sitä erikseen vielä vaatisikaan. Tässä artikkelissa pyrimme selittämään, miksi PHP-versiopäivitys tulisi tehdä ja miten se tehdään.

Sivustoni toimii hyvin – miksi tämä vaivannäkö?

Huonot uutiset löytyvät PHP:n sivuilta: PHP 7.1 -versiota vanhemmille versioille ei ole enää tarjolla tietoturvapäivityksiä. Tämä tarkoittaa sitä, että kyseisissä PHP-ohjelmointikielen versioissa löydettyjä tietoturva-aukkoja ei enää korjata. Tämä tekee sivustostasi haavoittuvaisen mahdollisille hyökkääjille. Tietoturvapäivitykset PHP:n 7.1 -versiolle päättyvät tänä vuonna joulukuun ensimmäisenä päivänä, joten päivitys uusimpaan PHP 7.3 -versioon on harkinnan arvoista.

Mikäli käytössäsi on vanhempi versio kuin 7.0, päiviys nopeuttaa sivustoasi kolmin- tai nelinkertaisesti ja saat käyttöösi liudan uusia ominaisuuksia kehittäjien elämää helpottamaan. Olemme listanneet näitä parannuksia artikkelissamme PHP:n 7.3 -version julkaisusta.

Todellisille PHP -nörteille voimme kertoa, että PHP 7.4.0 alpha 1 -versio on juuri äskettäin julkaistu. Se on kuitenkin vielä varhaisessa testausvaiheessa, eikä sitä suositella tuotantokäyttöön. PHP 7.4.0 on suunniteltu julkaistavaksi yleiseen käyttöön marraskuun lopulla 2019, eli juuri ennen 7.1 -version tuen päättymistä joulukuun alussa. PHP 7.3 tuki jatkuu aina joulukuulle 2021 saakka, joten sen tuen päättymisestä ei ole huolta aikoihin.

Tehdäksemme sivustosi PHP -version päivityksestä 7.3 -versioon mahdollisimman näppärää, lisäsimme esimerkin päivitysprosessista demosivustolla.

Varmista nykyinen PHP -versiosi

Aloitamme versiopäivityksen tuotantosivustolla, jossa on käytössä PHP 5.6. Mikäli et ole varma mikä PHP -versio web-palvelimellasi on tällä hetkellä käytössä, on hyvä tarkistaa onko päivitys edes tarpeen. Seravon WP-Palvelun asiakkaat voivat tarkistaa PHP-versionsa käyttämällä räätälöityä komentoa wp-check-php-version, joka myös varoittaa mikäli käytössä on vanha versio:

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

Jotkin palveluntarjoajat tarjoavat tiedon käytössä olevista versioista hallintapaneelissa, esim. CPanelissa. Jos tiedät käytössäsi olevan PHP-FPM (FastCGI), voit myös tarkistaa mikä PHP-prosessi on käynnissä seuraavalla komennolla ja etsimällä php-fpm -prosessia:

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)
...

PHP-versiota tarkistaessa komentorivillä pitää kuitenkin olla tarkkana, ettei luota sokeasti php -v -komentoon, sillä paikallinen PHP-asennus on erillinen palvelimella käytössä olevasta, eikä välttämättä ole versioltaan sama.

Mikäli ajamasi komennon tulokset viittaavat vanhempaan versioon kuin 7.1, tulisi sinun vakavasti harkita päivitystä uudempaan. Me opastamme sinut prosessin läpi syvällisemmin seuraavissa kappaleissa, jotta välttyisit yleisimmiltä sudenkuopilta prosessissa.

Tarkista yhteensopivuusongelmat PHP-koodissa

PHP-version yhteensopivuus tarkistetaan yleensä staattisella koodianalyysillä käyttämällä erilaisia työkaluja. Tätä varten Seravon asiakkailla on sivustoillaan käytössä wp-php-compatibility-check -skripti, joka voidaan ajaa kirjautumalla SSH:lla palvelimelle. Kyseinen skripti ottaa polun ja PHP-version parametreikseen ja ajaa PHP Codesnifferin konepellin alla yhdessä PHPCompatibilityn kanssa (jotka ovat molemmat avoimen lähdekoodin ohjelmistoja). Tässä esimerkissä etsimme PHP 7.3 yhteensopivuusongelmia wp-content -hakemistosta, sillä se sisältää kaikki lisäosat ja teemat. Oletamme käytössäsi olevan WordPress -ytimen olevan yhteensopiva PHP 7.3:n kanssa. Mikäli käytössä on vanhempi versio WordPressin ytimestä, se tulisi päivittää ensin.

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.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(SOME OTHER WARNINGS...)


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
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(SOME OTHER WARNINGS...)


Time: 50.42 secs; Memory: 107Mb

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

Skripti tulostaa tietoa löytämistään yhteensopivuusongelmista: tiedostonimen, rivin tiedostosta, tuloksen tyypin ja viestin joka kuvailee ongelmaa ja kuinka korjata se. Tuloksia on kahden tyyppisiä: varoituksia (warning) ja virheitä (error). Varoitukset eivät ole yhtä merkittäviä kuin virheet, jotka puolestaan todennäköisesti rikkovat sivustosi ainakin osittain. Esimerkiksi virhe Function split() is deprecated since PHP 5.3 and removed since PHP 7.0; Use preg_split() instead kertoo PHP-version päivittämisen uudempaan kuin 7.0 poistavan käytöstä split() -funktion, jota lisäosa käyttää. Tästä seuraa ylipääsemättömiä ongelmia kun lisäosan koodia yritetään ajaa sivustolla.

Muista ylimääräiset varokeinot

Koska ohjelmien versiopäivityksiin sisältyy aina riski asioiden pieleen menemisestä ja sivustosi kaatumisesta hetkellisesti, on suositeltavaa testata PHP-päivitys ensin palvelimella, joka on erillään tuotantopalvelimestasi. Tällä tavoin tuotantosivustosi kaatumiset vältetään ja sivustosi käyttäjät eivät joudu kärsimään ongelmista.

Tässä esimerkissä käytämme Seravon asiakkaille tarjottua varjoympäristöä uuteen versioon siirtymisen testaamiseen ennen päivitysten ajamista tuotantosivuston puolella. Tähän tarkoitukseen käy kuitenkin mikä tahansa tuotantoympäristöäsi vastaava identtinen WordPress-sivusto. Jos sinulla ei ole mahdollisuutta varjoympäristön käyttöön, tai olet jo tehnyt yhteensopivuustarkistuksen puhtain tuloksin, voit myös jatkaa PHP-päivitystä tuotantosivustolla huoltotilassa.

Jos sinulla ei ole mahdollisuutta varjoympäristön käyttöön, tai olet jo tehnyt yhteensopivuustarkistuksen puhtain tuloksin, voit myös jatkaa PHP-päivitystä tuotantosivustolla huoltotilassa.

Varmistaaksemme että varjoympäristö on identtinen nykyisen tuotantoympäristön kanssa, resetoimme varjon uusimpaan tuotantosivuston tilaan wp-shadow-reset -skriptillä, joka on kaikkien Seravon asiakkaiden tuotantosivustojen käytössä.

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.

Ennen tuotantoympäristöstä poistumista ja varjoympäristöön siirtymistä, ota tuore varmuuskopio tuotantosivustostasi varmistaaksesi että varasuunnitelma löytyy siltä varalta, että jokin menee pieleen päivitysprosessin aikana.

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

Ratkaise yhteensopivuusongelmat

Nyt siirrymme varjoympäristöön ratkaisemaan yhtensopivuusongelmat. Skriptin löytämät PHP-version yhteensopivuusongelmat johtuvavat lisäosista WP Native Dashboard ja Polylang. PHP:n ja kolmannen osapuolen lisäosien tai teemojen yhteensopivuusongelmien tapauksessa kannattaa heti kättelyssä tarkistaa onko niihin tarjolla päivityksiä, jotka korjaavat ongelmat uudempien PHP-versioiden kanssa.

Sinun ei kannata milloinkaan muokata kolmannen osapuolten lisäosien tai teemojen tiedostoja suoraan omalla palvelimellasi, sillä niiden päivitykset tulevat ylikirjoittamaan tekemäsi muutokset. Sen sijaan sinun tulisi ilmoittaa ongelmista lisäosan tai teeman kehittäjälle. Mikäli olet itse kehittäjä ja käyttämäsi lisäosa tai teema on avointa lähdekoodia, voit myös osallistua sen kehitykseen lisäämällä sille korjaavan päivityksen.

Sinun ei kannata milloinkaan muokata kolmannen osapuolten lisäosien tai teemojen tiedostoja suoraan omalla palvelimellasi, sillä niiden päivitykset tulevat ylikirjoittamaan tekemäsi muutokset.

Lisäosien päivitysten saatavuus voidaan nopeasti ja vaivattomasti tarkistaa näppärällä WordPressin komentorivityökalulla (WP-CLI), mikäli palvelimellasi on se asennettuna. Seravon asiakkaana tätäkään ei tarvitse erikseen miettiä.

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

Toinen vaihtoehto on käyttää WordPressin hallintanäkymän Lisäosat -sivua https://example.com/wp-admin/plugins.php. WP CLI:n tulosteen perusteella näyttää siltä, että Polylang-lisäosalle on päivitys tarjolla. Nyt kun olemme varjoympäristössä, voimme asentaa päivityksen suoraan:

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.

Harmillisesti WP Native Dashboardille ei ole päivityksiä tarjolla, sillä se on edellisen kerran päivitetty kuusi vuotta sitten. On järkevää vaihtaa tämä hylätty lisäosa johonkin toiseen, joka on aktiivisessa kehityksessä. Sopivaa korvaavaa lisäosaa voi etsiä WordPressin lisäosaluettelosta (tai teemojen tapauksessa teemahakemistosta). Esimerkissämme lisäosaa ei enää tarvita, joten se voidaan poistaa wp plugin uninstall wp-native-dashboard --deactivate -komennolla.

Ajetaan PHP compatibility check uudestaan:

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.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


(SOME SIMILAR WARNINGS...)


Time: 49.3 secs; Memory: 107Mb

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

Joitakin varoituksia Polylang -lisäosasta näkyy edelleen, mutta ne eivät vaikuta kovin kriittisiltä. Tämä lisäosa on kohtuullisen suosittu, aktiivisessa kehityksessä ja lisäosan lähdekoodi on automaattisesti testattu yhteensopivaksi PHP 7.3 -version kanssa Travis CI:llä, joten voimme jatkaa nykyisen PHP version vaihdosta PHP 7.3 -versioon varjoympäristössä varoituksista huolimatta. Seravon asiakkaille on oma opas aktiivisen PHP -version valitsemiseen, josta voi katsoa neuvoa vaihdokseen. Muissa tapauksissa suosittelemme, että käännyt palveluntarjoajasi dokumentaation tai asiakaspalvelun puoleen.

Testaaminen ennen tuotannon päivitystä

Kun olet saanut web-palvelimesi käyttämään PHP 7.3 -versiota varjoympäristössä, tarvitaan vielä joitakin testejä varmistamaan ettei mikään ole hajonnut. Mikäli olet Seravon asiakas, voi ajaa valikoiman hyväksymistestejä yksinkertaisesti ajamalla komennon 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

Koska mikään testijärjestelmä ei kykene testaamaan kaikkea, on hyvä tehdä myös manuaalisia testejä. Yksinkertaisin tapa tähän on seurata PHP:n virhelokin tulostusta komennolla tail -fn 0 /data/log/php-error.log samanaikaisesti kun selaat sivustoa.

Kun olet käynyt sivuston läpi onnistuneesti löytämättä virheitä tai puutteita toiminnallisuudessa, voit olla melko varma sivustosi yhteensopivuudesta PHP 7.3 -version kanssa. Päivitys tuotantosivustolle kannattaa tehdä mahdollisimman pienen liikennemäärän aikana, esimerkiksi yöllä tai aikaisin aamulla. Tällöin pääset maaliin pienimmillä mahdollisilla häiriöillä tuotantoympäristössä. Ei ole syytä huoleen, vaikka jokin menisi prosessissa pieleen, sillä tuotannosta aluksi otettu varmuuskopio on helppo palauttaa.

Etkö ole varma mistä aloittaa vai pelkäätkö rikkovasi vahingossa jotain? Jos olet Seravon asiakas, ei huolta: meidän asiantuntijamme hoitavat PHP-päivityksen mielellään puolestasi asiantuntijatyönä hintaan 89€/h +alv (työn kesto 1-2h) Kysy tarjousta help@seravo.com

Kommentoi

Leo Toikka

Ohjelmistokehittäjä

Hae WP-palvelu.fi:stä

Lue myös

Terveiset Berliinin WordCampista

16.7.2019

Berliinissä pidetty WordCamp Europe 2019 on takana ja olemme palanneet takaisin arkeen. Tämä oli viidestoista kerta kun sponsoroimme WordCamp-taphtumaa ja […]

Häiriötiedotus kansainvälistyy

15.7.2019

Seravon virallinen reaaliaikainen häiriötiedotus on tähän asti hoidettu Twitterissä @wppalvelu -tilin kautta. Tästä päivästä lähtien häiriötiedotteet julkaistaan tilin @SeravoStatus kautta. […]

13 tietokantavinkkiä WordPressille

9.7.2019

Jos pitäisi nimetä kaksi yleisintä ongelmaa WordPress-sivustoilla, vastauksemme olisi tietoturva ja nopeus. Pääasiallisesti näitä ongelmia yhdistää yksi tekijä: tietokanta. WordPress-sivuston […]