PHP 7.2 Kompatibilität

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
achiboy
Beiträge: 111
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

PHP 7.2 Kompatibilität

Beitrag von achiboy » Fr 6. Jul 2018, 10:20

Können wir hier die offenen Kompatibilität-Probleme bekanntgeben und gemeinsam lösen?

Bis jetzt habe ich folgende Fehler gefunden, die in GIT noch nicht behoben sind:
  • includes\include.frontend.user_edit.php
    => $messages = array(); von Zeile 98 auf Zeile 92 verschieben
  • includes\include.frontend.group_edit.php
    => $messages = array(); von Zeile 92 auf Zeile 91 verschieben
  • includes\include.upl_dirs_overview.php
    => $failedFiles = array(); von Zeile 89 auf Zeile 88 verschieben
  • includes\include.str_overview.php (z.B. Kategorieübersicht anzeigen)
    => Zeile 647: strlen anstatt sizeof verwenden
    => Zeilen 279+280 ersetzen durch ???? (habe bisher keine Lösung wegen rekursivem Aufruf)
  • includes\include.upl_files_overview.php
    => Zeile 398 ändern in
    $sCacheName = substr($sCacheThumbnail, strrpos($sCacheThumbnail, '/') + 1, strlen($sCacheThumbnail) - strlen(strrchr($sCacheThumbnail, '/')) + 1);
Noch nicht beheben konnte ich folgende Fehler:
  • Artikel editieren / im Frontend surfen
    PHP Deprecated: The each() function is deprecated. This message will be suppressed on further calls in \contenido\plugins\smarty\smarty_source\sysplugins\smarty_internal_compilebase.php on line 75
  • Kategorieübersicht anzeigen
    PHP Deprecated: The each() function is deprecated. This message will be suppressed on further calls in \contenido\includes\include.str_overview.php on line 279
    => Lösungsversuche siehe hier viewtopic.php?f=98&t=43207&p=178738#p178738
Zuletzt geändert von achiboy am Di 10. Jul 2018, 07:21, insgesamt 4-mal geändert.

Faar
Beiträge: 1328
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Faar » Fr 6. Jul 2018, 10:59

Artikelübersicht anzeigen
In der Funktion getAllValues() wird auth=NULL als parameter zugewiesen aber sizeof() ist im Prinzip count() und das erwartet ein Objekt oder Array.
auth=null ist hier also falsch, es sollte wohl auth=array() heißen.
Oder man splittet das in zwei Schritte auf:

Code: Alles auswählen

if (!is_null($auth) && sizeof($auth) > 0) {
wird zu
if (is_array($auth) || is_object($auth)){
   if(count($auth) > 0) {
   ...
Das Problem wird vermutlich aber viel früher schon irgendwo sein, wo nicht klar ist, ob $auth ein String, oder Array oder Objekt ist.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1328
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Faar » Fr 6. Jul 2018, 11:18

Artikel editieren / im Frontend surfen
so sieht es aus in Zeile 75:

Code: Alles auswählen

$kv = each($mixed);
Kann man vielleicht so schreiben:

Code: Alles auswählen

foreach($mixed as $key => $value) {
   $kv=array();
   $kv['key'] = $key;
   $kv['value'] = $value;
   ...
   ...
 }
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

achiboy
Beiträge: 111
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von achiboy » Fr 6. Jul 2018, 12:17

Faar hat geschrieben:
Fr 6. Jul 2018, 10:59
Artikelübersicht anzeigen
In der Funktion getAllValues() wird auth=NULL als parameter zugewiesen aber sizeof() ist im Prinzip count() und das erwartet ein Objekt oder Array.
auth=null ist hier also falsch, es sollte wohl auth=array() heißen.
Oder man splittet das in zwei Schritte auf:

Code: Alles auswählen

if (!is_null($auth) && sizeof($auth) > 0) {
wird zu
if (is_array($auth) || is_object($auth)){
   if(count($auth) > 0) {
   ...
Das Problem wird vermutlich aber viel früher schon irgendwo sein, wo nicht klar ist, ob $auth ein String, oder Array oder Objekt ist.
Danke für die Idee. Ich habe das jetzt so gelöst:

Code: Alles auswählen

        if (is_array($auth) || $auth instanceof Countable) {
			if (count($auth) > 0) {
				$authString .= " AND author = '" . $this->db->escape($auth->auth["uid"]) . "'";
			}
        }

Oldperl
Beiträge: 3982
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Franken, Bayern
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Oldperl » Fr 6. Jul 2018, 12:35

Servus,
Faar hat geschrieben:
Fr 6. Jul 2018, 11:18

Code: Alles auswählen

foreach($mixed as $key => $value) {
   $kv=array();
   $kv['key'] = $key;
   $kv['value'] = $value;
   ...
   ...
 }
Warum initialisierst Du eigentlich bei jedem Schleifendurchlauf das Array neu, so hast Du immer am Ende nur die letzte Schleife im Array.

Gruß aus Franken

Ortwin
*NEU* PHP 7.x Community Draft von CONTENIDO 4.9 auf github
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das neue Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

Faar
Beiträge: 1328
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Faar » Fr 6. Jul 2018, 13:10

Oldperl hat geschrieben:
Fr 6. Jul 2018, 12:35
Servus,
Warum initialisierst Du eigentlich bei jedem Schleifendurchlauf das Array neu, so hast Du immer am Ende nur die letzte Schleife im Array.
Gruß aus Franken
Ortwin
Damit es immer schön sauber ist 8)

Nein, Spass beiseite, ich habe nicht geschaut, ob man am Ende der Schleife das Array noch braucht.
Ich habe nur diese Zeile betrachtet und da kein Zähler im Array ist, wird es sinnvollerweise nur einen Schlussel und einen Wert geben.
Dadurch habe ich eine Bestimmtheit, was im Array ist und auf diese Weise zugewiesen wird.
Es findet ja nur ein Austausch statt und dafür ist es gut, wenn das Array bei jedem Druchlauf jungfräulich ist.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

achiboy
Beiträge: 111
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von achiboy » Di 10. Jul 2018, 06:45

Ich habe mich an die class.session.php herangewagt.
Mit diesem Code ab Zeile 225 kommt bei mir das selbe heraus:

Code: Alles auswählen

            case 'array':
                // $$var is an array. Enumerate the elements and serialize them.
                $str .= "\$$var = array(); ";
                eval("\$l = array(); foreach(\$$var as \$k => \$v) {\$l[] = array(\$k,gettype(\$k),\$v);}");
                foreach ($l as $item) {
                    // Structural recursion
                    $this->_rSerialize($var . "['" . preg_replace("/([\\'])/", "\\\\1", $item[0]) . "']", $str);
                }
                break;
Mich erstaunt es ein wenig, weil ich nicht mehr auf den Typ "array" abfrage, aber es funktioniert.

achiboy
Beiträge: 111
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von achiboy » Di 10. Jul 2018, 06:47

Ist dieser Thread eigentlich für das Contenido-Team von Interesse?
Ich hoffe ja schon, dass diese oder ähnliche Lösungen im Core eingepflegt werden...

achiboy
Beiträge: 111
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von achiboy » Di 10. Jul 2018, 07:21

und nun zur include.str_overview.php.
hier habe ich folgende Änderungen gemacht:

Zeile 279 alt

Code: Alles auswählen

    while ($item_list = each($items)) {
        list($key, $item) = $item_list;
Zeile 279 neu

Code: Alles auswählen

    while ($item = array_shift($items)) {
Zeile 343 alt

Code: Alles auswählen

        if (array_key_exists($key + 1, $items)) {
            $nextItem = $items[$key + 1];
Zeile 343 neu

Code: Alles auswählen

        if (array_key_exists(0, $items)) {
            $nextItem = $items[0];

Faar
Beiträge: 1328
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Faar » Di 10. Jul 2018, 08:36

achiboy hat geschrieben:
Di 10. Jul 2018, 06:47
Ist dieser Thread eigentlich für das Contenido-Team von Interesse?
Ich hoffe ja schon, dass diese oder ähnliche Lösungen im Core eingepflegt werden...
Der Thread wird beobachtet.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Oldperl
Beiträge: 3982
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Franken, Bayern
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von Oldperl » Di 10. Jul 2018, 12:20

Faar hat geschrieben:
Di 10. Jul 2018, 08:36
Der Thread wird beobachtet.
:shock: Sag nur! Hätte ich das gewusst... :roll: 8)
*NEU* PHP 7.x Community Draft von CONTENIDO 4.9 auf github
CONTENIDO 4.9 Entwickler-Handbuch - Publikation auf medium.com zu meinem angedachten Entwickler-Buch zu CONTENIDO 4.9
ConLite 2.0, alternatives und stabiles Update von Contenido 4.8.x
phpBO Search Advanced - das neue Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

xmurrix
Beiträge: 2605
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von xmurrix » Di 10. Jul 2018, 17:16

Hallo achiboy,

danke für die Zusammenstellung der offenen Fehler.

Ich kann die hier beschriebenen Ansätze zur Lösung der Fehler gerne in Git pushen. Einiges ist schon gefixt/angepasst, überall wurde die Verwendung von each() gegen Alternativen ersetzt.

Die einzige Stelle, die noch each() verwendet, ist die Session. Da war meine Idee, auch das eval() zu entfernen, allerdings hat mein Ansatz nicht funktioniert. Bin aber auch nicht dazugekommen, mit mehr mit dem Problem zu beschäftigen.

Der Lösungsversuch in viewtopic.php?f=98&t=43207&p=178736#p178735 scheint sehr gut zu sein, das sollte man sich genauer ansehen.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.9.12
CONTENIDO links: Documentation, API documentation

xmurrix
Beiträge: 2605
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von xmurrix » Di 10. Jul 2018, 17:31

achiboy hat geschrieben:
Di 10. Jul 2018, 06:45
Ich habe mich an die class.session.php herangewagt.
Mit diesem Code ab Zeile 225 kommt bei mir das selbe heraus:

Code: Alles auswählen

            case 'array':
                // $$var is an array. Enumerate the elements and serialize them.
                $str .= "\$$var = array(); ";
                eval("\$l = array(); foreach(\$$var as \$k => \$v) {\$l[] = array(\$k,gettype(\$k),\$v);}");
                foreach ($l as $item) {
                    // Structural recursion
                    $this->_rSerialize($var . "['" . preg_replace("/([\\'])/", "\\\\1", $item[0]) . "']", $str);
                }
                break;
Mich erstaunt es ein wenig, weil ich nicht mehr auf den Typ "array" abfrage, aber es funktioniert.
Das macht einen guten Eindruck, da wird ein neues Array erstellt und für jeder Eintrag die $this->_rSerialize() aufgerufen. Habe das zwar nicht getestet, aber das sollte so Funktionieren.

Meine Idee var die Verwendung der in PHP vorhandenen Funktion serialize(), um damit die in der Session zu speichernden globalen Variablen zu serialisieren und in $_SESSION zu speichern. Problematisch könnte es mit Objekten werden, also mit Auth, Perm oder anderen Objekten, die man danach eventuell nicht sauber wiederherstellen kann.

Gruß
xmurrix
CONTENIDO downloads: CONTENIDO 4.9.12
CONTENIDO links: Documentation, API documentation

xmurrix
Beiträge: 2605
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von xmurrix » Di 10. Jul 2018, 21:21

Folgende Dateien wurden vorhin angepasst und in Git gepusht:
- class.session.php
- include.frontend.group_edit.php
- include.frontend.user_edit.php
- include.str_overview.php
- include.upl_dirs_overview.php
- include.upl_files_overview.php

Andere Dateien/Bereiche, die in diesem Thema angemerkt sind, wurden schon vorher bearbeitet. Somit sollten alle Punkte aus diesem Thema abgearbeitet sein, auch das Problem mit der Session und der rekursive Aufbau der Kategorien in include.str_overview.php.

Bitte an alle beteiligten, die Änderungen auch unter euren Umgebungen zu prüfen, bei mit in Windows 10 mit PHP 7.2.6 läuft das alles wie gewünscht.

Grüße
xmurrix
CONTENIDO downloads: CONTENIDO 4.9.12
CONTENIDO links: Documentation, API documentation

mikedreissig
Beiträge: 34
Registriert: Di 10. Jan 2006, 19:28
Kontaktdaten:

Re: PHP 7.2 Kompatibilität

Beitrag von mikedreissig » Do 9. Aug 2018, 17:57

Hallo,

das klingt super, nur wie kommt man an die angepasste Version im GIT heran? Gibt es dort irgendwo auch eine Möglichkeit zum Download?

Grüße mike

Antworten