Problem von Contenido mit PHP 5.3.0

Gesperrt
thetaphi
Beiträge: 1
Registriert: Do 2. Jul 2009, 08:36
Kontaktdaten:

Problem von Contenido mit PHP 5.3.0

Beitrag von thetaphi » Do 2. Jul 2009, 08:58

Hallo,

ich wollte hier ein paar Tips zum Einsatz von Contenido unter dem neuen PHP 5.3 geben, da es in der Standardeinstellung aufgrund eines Bugs in 5.3.0 zu einem SIGSEGV des Webservers kommt. Da ich selbst zur Development-Crew von PHP gehöre und auch schon lange die uralte mysql-Extension entfernen würde, hier auch meine Vorschläge.

PHP 5.3 wird jetzt mit einem neuen Treiber für die Anbindung an die MySQL-Datenbank ausgeliefert. Dieser ändert prinzipiell nichts an der API für PHP Code, es wird allerdings aus Lizenzgründen und vor allem wegen besserer Integration in den PHP-Core ein eigener "MySQL-Treiber" benutzt, der hinter den Extensions mysql, mysqli und PDO_mysql liegt (siehe hierzu auch die Hilfe: http://www.php.net/manual/en/mysqli.mysqlnd.php). Es ist davon auszugehen, dass neue Pakete für Linux diese Extension benutzen, da sie um einiges schneller ist und automatisch persistente Verbindungen zu MySQL unterstützt. PHP-Code, der MySQL benutzt, verwendet wie bisher die drei extensions, wobei PDO oder mysqli zu bevorzugen ist.

Bei meinen Tests mit Contenido unter PHP 5.3.0 (ich habe leider während der RC-Phase, Contenido nicht mitgetestet), habe ich jedoch einen Bug in PHP 5.3.0 festegestellt, der den Webserver crashen lässt, wenn man sich mit Contenido im Backend einloggt. Grund für das ganze ist die Tatsache, das standardmässig Contenido immer noch die mysql-extension benutzt und nicht mysqli. Der entsprechende Bug und auch für die Developer von Contenido, wie man es direkt im Code umschiffen kann: http://bugs.php.net/bug.php?id=48745

Für alle User, die PHP 5.3 einsetzen wollen:
  • Benutzt mysqlnd und installiert auch die mysqli extension von PHP
  • Stellt in der config.php unter contenido/includes den Datenbanklayer von mysql auf mysqli (auch wenn drübersteht es ginge angeblich nur mit "mysql". Contenido liefert allerdings auch Support für mysqli aus.
  • PHP 5.3 hat die Posix RegEx Funktionen deprecated (also ereg_irgendwas(), man soll jetzt die PERL regex umstellen und preg_irgendwas() benutzen. Contenido sollte das ändern. Solange das nicht geschieht, sollte man deprecation warnings ausschalten, dafür muss man das Error-Level mittels error_reporting() in contenido/includes/config.local.php eintragen oder error-reporting ganz ausmachen).
Um den PHP-Bug zu umgehen, kann man auch unter conlib den mysql-Support so modifizieren, dass die Spaltenbeschreibungen einer Tabelle nicht via mysql_list_fields() geholt werden (was deprecated ist!), sondern wie bei mysqli via einem dummy-query. Das sollten die Contenido-Developer evtl machen. Und vielleicht mysqli als Standard bei Neuinstallationen benutzen.

idea-tec
Beiträge: 1242
Registriert: Do 19. Sep 2002, 14:41
Wohnort: Dichtelbach
Kontaktdaten:

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von idea-tec » Do 2. Jul 2009, 09:05

Ja, wie geil ist das denn!!! :D :D :D
Danke für diesen SUPER-Post
MfG, Karsten
Nicht Können bedeutet nicht, dass man etwas nicht beherrscht, sondern lediglich, dass man sich nicht traut es zu tun ;-)
| Internet | Ihr Logo deutschlandweit auf T-Shirts |
Diplomatie: Jemanden so in die Hölle zu schicken, dass er sich auf die Reise freut!!! ;-)

Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von Oldperl » Sa 11. Jul 2009, 13:26

Hallo thetaphi,

vielen Dank für die Info's. Hier dann auch gleich der Workaround dazu.

Öffne Datei conlib/db_mysql.inc
Suche Zeile 365 ff

Code: Alles auswählen

    if ($table) {
      $this->connect();
      $id = @mysql_list_fields($this->Database, $table);
      if (!$id) {
        $this->halt("Metadata query failed.");
        return false;
      }
ersetze durch

Code: Alles auswählen

    if (isset($table)) { // E_NOTICE fix 07.2009 O.Pinke
      $this->connect();
      $id = mysql_query("SHOW COLUMNS FROM ".$table); // PHP 5.3 fix 07.2009 O.Pinke, PHP 5.3 crashes with deprecated mysql_list_fields()
      if (!$id) {
        $this->halt("Metadata query failed.");
        return false;
      }
Öffne die Datei contenido/includes/config.misc.php
Suche Zeile 140
Ersetze

Code: Alles auswählen

error_reporting (E_ALL ^E_NOTICE);
durch

Code: Alles auswählen

error_reporting (E_ALL ^E_NOTICE ^E_DEPRECATED);  // add ^E_DEPRECATED since deprecated functions in PHP5.3 are replaced
Getestet unter Win2000, XAMPP, PHP5.3.
Bitte unter anderen Serverkonstellationen testen. Sollte dann in die nächste Contenido Version.

Gruß aus Franken

Ortwin

PS: :arrow: verschoben nach Bugs
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

thetaphi
Beiträge: 1
Registriert: Do 2. Jul 2009, 08:36
Kontaktdaten:

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von thetaphi » So 12. Jul 2009, 14:26

Ist sicher, dass das neue query so funktioniert? "Show colums from table" liefert doch, soviel ich weiss, ein Resultset zurück, das ausgewertet werden muss. Die Spalten dieses Resultsets sind doch nicht gleichbedeutend mit den Spalten der Datenbanktabelle, es wird doch eher eine Zeile pro Spalte der Tabelle zurückgeliefert? Der folgende PHP-Code wertet nämlich die Struktur des Resultsets aus und liest nicht seinen Inhalt.
Sicherheitshalber würde ich (und so habe ich es getestet während des ausprobierens), den code aus db_mysqli zu übernehmen (dummy query: "select * from table limit 1").

So stehts in db_mysqli.php:
[code=php]
// if no $table specified, assume that we are working with a query
// result
if ($table) {
$this->connect();
$id = mysqli_query($this->Link_ID, sprintf("SELECT * FROM %s LIMIT 1", $table));
if (!$id) {
$this->halt("Metadata query failed.");
return false;
}
}
[/code]

Gruss,
Uwe

Oldperl
Beiträge: 4255
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Kontaktdaten:

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von Oldperl » Mo 13. Jul 2009, 13:41

Hallo Uwe,

danke für's gegenlesen. Selbstverständlich hast du recht. Ich hab da auf die Schnelle einfach den empfohlenen Query auf php.net genommen, man sollte sich aber erst mal besser in die Funktion reindenken. :-(
Ich hab nun noch mal ein paar Messungen gemacht ob ich über den SHOW-Befehl schneller wäre, bei gegebener Tabelle, aber man braucht dann gut die 1 1/2-fache Zeit der LIMIT-Abfrage.
Also übernehmen wir das von mysqli auch nach mysql, wobei die Position des Link_ID-Parameters geändert werden muss. Auch sprintf macht hier Sinn, da wir ja eine public-Klassenfunktion haben.

Code: Alles auswählen

    if ($table) {
      $this->connect();
      $id = mysql_query(sprintf("SELECT * FROM %s LIMIT 1", $table), $this->Link_ID); // PHP 5.3 fix 07.2009 O.Pinke, PHP 5.3 crashes with deprecated mysql_list_fields()
      if (!$id) {
        $this->halt("Metadata query failed.");
        return false;
      }
Gruß aus Franken

Ortwin
ConLite 2.1, alternatives und stabiles Update von Contenido 4.8.x unter PHP 7.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog

thetaphi
Beiträge: 1
Registriert: Do 2. Jul 2009, 08:36
Kontaktdaten:

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von thetaphi » Mo 14. Sep 2009, 17:46

Das Problem ist im SVN von PHP behoben, sollte somit in der nächsten 5.3 Version enthalten sein. Trotzdem sollte Contendio nicht deprecated Funktionen benutzen (das printet vor allem dauernd warnings aus).

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

Re: Problem von Contenido mit PHP 5.3.0

Beitrag von xmurrix » Di 15. Sep 2009, 21:56

Hallo zusammen,

hatte auch kürzlich das Vergnügen, Contenido 4.8.12 unter PHP 5.3 zu sehen. Es ist zwar noch lange dauern, bis die ersten Provider auf 5.3 umstellen, aber solange sollte meiner Meinung nach nicht gewartet werden.

Bin dafür, die Contenido Sourcen von den als Deprecated gekennzeichneten Funktionen zu bereinigen.

Details gibt es unter:
http://us2.php.net/manual/en/migration53.deprecated.php

Grüße
xmurrix

Gesperrt