PHP 5.3 - Tapasztalatok, megoldások, szitkozódások


[Szerveren PHP 5.2 -> 5.3 frissítés után]
...
<#lacyc3> na, lesznek itt még szívások
<#yitsushi> lacyc3: nem akarok bunko lenni, de eeeeeen megmondtam

És tényleg megmondta. Hihetetlen mennyiségű szívás akad a PHP 5.3 körül, nekem legalábbis sikerült egy párba belefutnom, így gondoltam megosztom veletek is a tapasztalatokat, hibákat és (ha találtam rá) megoldásokat. Egy biztos: Downgrade-elni nem fogok, ahhoz nagyon - nagyon nyomós érv kellene.

Mindenütt jó, de a legjobb ~ ugye? De mi van akkor ha nem ~ akarjuk tárolni a session-öket, hanem rábizzuk magunkat a PHP-ra, oda rakja ahova akarja? Ez esetben ha a szerveren él az open_basedir korlátozás akkor kellemetlen meglepetések érhetnek minket (megúgom hogy a Drupal és a Wordpress rendes ilyen tekintetben is). A beállított hibajelentés szinttől függően vagy egy fehér lapot vagy open_basedir in effect.. blabla szöveget kapunk. Jessz, az 5.2-es PHP-nak jó volt a default érték is, legalábbis nem izgatta - miért is nem jó az öcsinek? Lényeg, hogy be kellene állítani minden egyes vhost-ra az open_basedir értékét úgy, hogy a lefedje a session-ök helyét is. Nagy lustaságomban összegányoltam egy python scriptet, ami hozzácsapja a vhost-ok konfigurációjához ezt az apróságot, tedd Te is azt :)

Következő meglepetés: Ugyanezt kell tennünk a feltöltött állományok ideiglenes helyével is.

Ha használsz xdebug-ot PHP hibakereséshez, akkor nem árt, ha 2.1-es verzióra frissíted, egyéb esetben nem fog működni. Az alapértelmezett beállítások kikapcsolva tartják az xdebug-ot, így be kellene kapcsolni (apache esetén): /etc/php/apache2-php5/ext-active/xdebug.ini
[geshifilter-code]xdebug.default_enable="1"[/geshifilter-code]

Nagyszerű, már működik csak.. nem formázza a kimenetét. Ehhez a php.ini-ben be kell kapcsolni a html_errors opciót.

A kiszolgáló oldalon nem kell több nagyobb módosítással számolni, de azért ne csukd be az editort amiben a php.ini van, szükséged lesz még rá. ;)

Kezdjük a kedvenc szoftver párosommal, a Gallery2 + Drupal kombóval. A Gallery2 az 5.2-es PHP-val is nyüszög időnként, de az igazi problémák az 5.3-assal jönnek elő.

Ha véletlenül működik még a galéria, akkor a következő hibaüzenettel ajándékoz meg minden egyes eléréskor a Drupal (ha össze vannak kapcsolva persze):

[geshifilter-code]warning: strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.[/geshifilter-code]

A hibaüzenet eltüntetéséhez a php.ini-ben a következő értéket kell szerkeszteni:
[geshifilter-code]date.timezone = Europe/Budapest[/geshifilter-code]

Persze minden strftime() függvényt használó alkalmazás beleütközik ebbe a hibába, én csak itt vettem észre először.

A szélességi / hosszúsági adatok kitöltése szvsz felesleges, szóval maradhat kitöltetlenül / kikommentezve.

A következő probléma megoldása ennél picit nehezebb volt. Találós kérdés: Mit tegyünk, ha a legfrissebb 2.3.1-es galériánk hibakereső üzemmódban feltölti a képet, nem hibakeresőben pedig nem, a debug napló pedig első ránézésre nem tartalmaz hibát, de legalább egy kisregény hosszúságú? Természetesen telepítsük újra!

A galéria telepítése nem indul. Egyszerűen lehal és kapunk egy üres lapot, vagy rengeteg depercated hibával leáll. A php.ini-ben át kellene állítani az error_reporting értékét ilyen, vagy megengedőbb értékre:
[geshifilter-code] error_reporting = E_ALL & ~E_NOTICE [/geshifilter-code]

A geléria telepítése immár hogy kilőttük a hibajelentés egy részét, az eddig megszokott ütemben halad. Adatbázis adatokat megadtunk, config.php -t megírta nekünk, minden rendben van. Aztán a 8. lépésnél amikor telepíti a galériát magát, valami nem működik. Megáll a csík, mint villamos az áramszünetben. Se előre se hátra. Majd kisvártatva szürke alapon kicsit szürkébb betűkkel kiböki az installer:
[geshifilter-code]Object of class GalleryStorageExtras could not be converted to string...[/geshifilter-code]

Nagyszerű, tehát osztályt szeretne string-é konvertálni. Ez azt jelenti hogy valamit csúnyán elírtak. A probléma ott van, hogy ugyanez 5.2-es PHP-val még ment. Egy gyors kérés a Google-höz és máris kidobja az eredményt: Szerkeszd meg a galeria_gyoker/lib/adodb/drivers/adodb-mysqli.inc.php 98. sorát és _talán_ jó lesz.
Tehát a 98. sornak így kellene kinéznie:
[geshifilter-code]mysqli_options($this->_connectionID,$arr[0],$arr[1][0]);[/geshifilter-code]

Őszinte leszek: Se kedvem, sem energiám nem volt kikeresni a kódbol hogy ezzel milyen ördögöt szabadítottam rá a rendszerre, de legalább működik. Tehát, kezdjük elörről a telepítést!

[Lustáknak: Itt a módosított állomány: http://letolt.lacyc3.eu/articles/php-5.3/adodb-mysqli.inc.php ]

Panaszkodik a telepítő "galéria integritás" címén hogy bizony bizony módosítuttunk egy fontos állományt. Lépjünk tovább ezen az apró kis kellemetlenségen. A telepítést végigizgulva megfigyelhetjük ahogy a javításunk után minden csodálatos minden hiba nélkül befejeződött, hihetetlen!

Próbáljunk meg feltölteni egy képet. Felmegy, majd.. tádá adatbázis hiba. Töltsünk fel újra egy képet, és konstatáljuk hogy megszületett a PHP 5.3 és a Gallery2 ötvözéséből a Windows Millenium PHP Edition, ugyanis működik! Nem tudni miért igen, vagy miért nem, de működik, a java feltöltővel egyetemben!

Vegyük észre, hogy a munkafolyamatok állását jelző csík nem a régi és lassabb lett a galéria. De legalább működik. Pár alapvető plugin-t kipróbáltam vele és úgy néz ki nem parasztvakítás, tényleg megy.

Ha van olyan elvetemült aki hajlandó kipróbálni a sajnos RC állapotban lévő gallery3-at, annak csak azt mondom hogy a szép, új, csili-vili felület mellett bugokkal is gazdagabb lett az új galéria és mindezek mellett legalább sokkal lassabb :)

Beszéltem itt valami Drupal-ról. A Drupal rendes jószág, ha nincs agyontömve beépülőkkel, akkor nagyon rendesen együttműködik az új PHP-val, egy rossz szava sincs. Itt a lacyc3.eu -n megúsztam mindent, bár a spam-botok ugyanolyan vehemenciával esnek neki Captcha-nak (és el is tőle), mégsincs hibaüzenet, nem zaklat e-mail-ben hogy ezt alaposan elszúrtad. Csak megy. Hurrá!

Van ahol nem ilyen rózsás a helyzet. Egyik gyenge pillanatomban sikerült valakinek rávennie, hogy kössem össze a Drupal-t a Gallery2-vel mert milyen jó is hogy egy login két helyre is jó, de ha már itt tartunk akkor lehessen Drupal-ból a galériába feltöltött képeket nézegetni. Sajnos ez a galéria még <2.3.1, azaz nem "PHP 5.3 kompatibilis". Hála a "cross-login" megoldásnak, ha a galéria lehal, akkor a Drupal is, így egészen egyszerűen nem tudok bejelentkezni, mert a szerver megáll és a válasz pontosan 0 méretű lesz.

De! Ha ez ismerős, akkor tessék csak szépen frissíteni a galériát:
[geshifilter-code]Deprecated: Assigning the return value of new by reference is deprecated in galeria/bootstrap.inc on line 43[/geshifilter-code]

Lássuk csak a frissítés menetét. Letöltöd a legfrissebb galériát, indítod az index.php -t, végig vezet egy frissítő programon és kész is. Természetesen ez nem így fog menni :)

A legelső probléma a 6. lépésnél fog előjönni, ahol törölni szeretné a cache-seket. Ez sajnos nem fog neki menni, vagy megál, vagy üres üzenetet ad vissza. Nekem konkrétan a proxy mondta hogy a kért oldal nem létezik. Semmi baj, írjuk át az URL-ben a lépés azonosítót eggyel nagyobbra:
[geshifilter-code]upgrade/index.php?step=7[/geshifilter-code]
Itt kézségesen közli velünk hogy sikeresen kitakarított mindent. Természetesen nem tette meg, így a galéria állományait tartalmazó könyvtár tmp alkönyvtárát manuálisan takarítsuk ki. Ha mégis üres lenne (3 galéria frissítésből egyszer sikerült kitakarítani) akkor örülj neki :)

A frissítés után mintha csoda történt volna. A galéria megy, az albumok a helyükön, tökéletes.. lenne, ha nem próbálnánk meg feltölteni egy képet. Lelövöm a poént: Nem megy fel, meg sem mozdul a folyamatot jelző csík, csak figyel mint aki odatett a képernyő szélére.

Most ha eddig figyeltél, tudod hogy hol kell mit cserélni, nem írom le újra, csak azért sem! :)

Ameddig működik a galéria, ajánlom hogy a hivatalos tárolóból frissítsd a galéria moduljait (ha használsz ilyet). Ha kész, és még működik is minden, akkor nagy a valószínűsége hogy ez így is marad.

Kellemes meglepetés: A Drupal bejelentkezése is megjavult, pedig még csak rá se kellett olvasni! :)

Félreértés elkerülése végett: Nem azért problémázok mert olyan szoftverek inkompatibilisek a PHP 5.3-mal amik nincsennek rá felkészítve. Pontosan az a problémám hogy elvileg a fejlesztő felkészítette az új verziót.

Kicsit más terep, Webmail. A Roundcube szép, gyors, biztonságos, csak a legfrissebb stabil (0.3.1) nem működik együtt az új PHP-val, adatbázis hibára panaszkodva. Konkrétan ~7 sor hibádzik a program/lib/MDB2/Driver/mysqli.php -ban valahogy így:
[geshifilter-code]DB Error: MDB2 Error: unknown error Query: _execute: [Error message: Unable to execute statement] [Last executed query: UPDATE users SET last_login=now() WHERE user_id=?] [Native code: 0][/geshifilter-code]

A hibás állomány méretére való tekintettel inkább nem kínozlak sorok számolásával, hanem letöltheted a patch-et vagy az egész mysqli.php -t is. :) Majd' elfelejtettem: A 0.4-es béta tökéletesen működik mindenféle foltozgatás nélkül.

Patch: http://letolt.lacyc3.eu/articles/php-5.3/mysqli-0.3.1.php.patch
Állomány: http://letolt.lacyc3.eu/articles/php-5.3/mysqli.php

És láss csodát: működik :)

Így a tapasztalatok végén ők érdemlik meg hogy rányomjuk a virtuális PHP 5.3 kompatibilis matricát (ha lesz elég kreativitásom majd lehet csinálok ilyesmit :)). Velük egyáltalán nem volt bajom, out-of-box mentek mindenféle szöszölés nélkül:

Drupal 6.17 és 7 aktuális csv verziója,
Joomla 1.6.0 beta 4,
Wordpress 3,
RoundCube 4 beta,
Piwik 0.6.4,
Gallery 3 (ettől függetlenül még egy kalap nyuszifül),
LaSyS-Engine v4.x :))