PHP7.4 ja PHP 8 tuki

Started by lamikr, 09.03.21 - klo:11:25

Previous topic - Next topic

lamikr

Kiitoksia MLInvoicesta, ohjelma on aikaisemmin pelannut vuosia hyvin. (1.17 ollut käytössä)
Nyt tuli kuitenkin ongelmia kun päivitin Linux distroni ja PHP vaihtui siinä 5.6:sta 8.02:ksi.
Osan ongelmista olen saanut rarkottua ja osa on vielä ratkomatta, erityisesti _SESSION objektien avulla tapahtuvan sessionin hallinnan kanssa tuntuisi olevan ongelmia.

Tässä stepit mitä olen tehnyt.
1) Päivitys viimeisimpään git versioon
- purin ensin 1.21.2 version zipin 1.17 version päälle
- ajoin sen jälkeen pätchin 1.21.2:n ja masterissa olevan koodin diffien välillä
- varmistin että tiedostojen käyttöoikeudet pysyivät edelleen samoina
- Jos ymmärsin oikein niin mysql tietokannalle ei tarvise itse ajaa mitään migrointi scriptiä siirryttäessä 1.17:sta uudempiin versioihin?
  (backupit tietokannasta ovat kunnossa)

2) Virhe-ilmoitukset logissa curly characterien käytöstä Stringin käsittelyssä. Tämän uskoakseni korjasin seuraavalla tavalla.
- vendor/michelf/php-markdown komponentti jossa käytettiin joissain kohdissa PHP:ssa Stringin käsittelyssä poistettuja { ja } merkkejä.
- korjasin tämän kopioimalla php-markdownin tiedostojen päälle oman distroni php-markdown version 1.9.0:n mukana tulevat uudemmat versiot hakemistosta /usr/share/php/Michelf/  jossa tuo oli googlauksen perusteella korjattu

3) Virhe PHP:n uudemmista versioista poistetusta get_magic_quotes_gpc() funkkarista
- tätä olen yrittänyt korjailla alla olevalla diffillä mutta ihan en ole varma mikä tuo slashien lisäys/poisto logiikka on koska en ole vielä
  ehtinyt debugata miten tuota käytetään
--- miscfuncs.php   2019-08-31 15:09:39.000000000 +0300
+++ fixed_mlinvoice/miscfuncs.php   2021-03-08 23:45:19.346966916 +0200
@@ -36,10 +36,7 @@
  */
function gpcAddSlashes($strString)
{
-    if (!get_magic_quotes_gpc()) {
-        return addslashes($strString);
-    }
-    return $strString;
+    return addslashes($strString);
}

/**
@@ -51,9 +48,6 @@
  */
function gpcStripSlashes($strString)
{
-    if (get_magic_quotes_gpc() && is_string($strString)) {
-        return stripslashes($strString);
-    }
     return $strString;
}

4) PHP:n _SESSION objektin kanssa on edelleen jotain häikkää enkä ole saanut sisään loggausta login.php:sta index.php:hen toimimaan
- Ensimmäinen oma ongelma oli se että logissa näkyi virheitä siitä että sessionfuncs.php:n session_set_save_handler ja session_name funktioita kutsutaan liian myöhään sessionin jo alettua. Yritin korjailla tätä tekemällä funktion
function sesInitSession()
{
    error_log("sesInitSession started");   
    session_set_save_handler(
        'dbSessionOpen', 'dbSessionClose', 'dbSessionRead',
        'dbSessionWrite', 'dbSessionDestroy', 'dbSessionGc'
    );
    session_name(_SESSION_NAME_);
    if (_SESSION_RESTRICT_PATH_) {
        session_set_cookie_params(0, getSelfDirectory() . '/');
    }
}
ja kutsumalla sitä login.php:n ja index.php:n alussa ennen session_start kutsua.

Toinen ongelma on se että tuosta huolimatta csrf, REMOTE_ADDR eivät jostain syystä tunnu kunnolla säilyvän _SESSION objektissa. Joitain häkkäilyjä olen tehnyt yrittämällä kutsua noita sesInitSessioneita ja session_start kutsuja aina <php blokkien alussa mutta edelleen en saa loginin jälkeistä header(index.php) siirtymää toimimaan vaan kun index.php:ssa kutsutaan sesVerifySession funktiota niin SESSION['REMOTE_ADDR'] on asettamatta vaikka se on hieman aikaisemmin asetettu oikein login.php:ssa.

Itsellä on mlinvoice käytössä vain yksittäisessä ei internettiin kytketyssä koneessa joten SSL ei ole enabloituna. En tiedä voisiko SSL:n enablointi korjata tuon ongelman uudemmissa PHP versioissa?

Ere Maijala

En ole vielä ehtinyt testata ja fiksata PHP 8:lla, mutta kannattaa ehkä ottaa kokeiluihin pohjaksi GitHubista master-versio, jossa on päivitetty riippuvuudet, ja kaiken pitäisi toimia ainakin PHP 7.4:ään asti. Seuraavaan versioon on tarkoitus joka tapauksessa saada PHP 8 -tuki kuntoon.

Ere Maijala

Uusimmassa master-versiossa on lisää korjauksia. Toimii minulla nyt PHP 8:lla muuten, mutta pitää laittaa deprekaatio-varoitukset pois päältä, etteivät ne häiritse. Eli php.ini:ssä pitää olla esim.

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Eväste- ja sessio-ongelmat juontavat yleensä juurensa siihen, että skripti tulostaa jotain ennen kuin headerit lähtevät. Varmista siis, ettei näkyviin edes lähdekoodissa tule mitään ylimääräistä. On tullut vastaan myös tilanteita, joissa Chromium-pohjaiset selaimet Ubuntussa sekoavat jotenkin, ja vain buuttaus auttaa.