Dotclear

Vous n'êtes pas identifié(e).

Annonce

#1 2009-04-12 07:27:01

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Dotclear et PHP 5.3.0

Bonjour,

PHP 5.3.0 est sur la rampe de lancement... ce serait donc super si dotclear était opérationnel lors de sa sortie officielle.

J'ai donc installé dotclear sur la version 5.3.0RC1... marche pô :(

Le problème c'est quand on appelle une fonction qui attend une référence, en direct ça marche, mais via une procédure de callback ça ne marche visiblement plus.. on obtient un wagon d'erreur du genre (avec xdebug pour le backtrace)

PHP Warning:  Parameter 1 to metaWidgets::initDefaultWidgets() expected to be a reference, value given in /home/rpmbuild/site/blog/inc/core/class.dc.core.php on line 304
PHP Stack trace:
PHP   1. {main}() /home/rpmbuild/site/blog/index.php:0
PHP   2. require() /home/rpmbuild/site/blog/index.php:22
PHP   3. dcModules->loadModules() /home/rpmbuild/site/blog/inc/public/prepend.php:62
PHP   4. dcModules->loadNsFile() /home/rpmbuild/site/blog/inc/core/class.dc.modules.php:127
PHP   5. dcModules->loadModuleFile() /home/rpmbuild/site/blog/inc/core/class.dc.modules.php:479
PHP   6. require() /home/rpmbuild/site/blog/inc/core/class.dc.modules.php:501
PHP   7. include() /home/rpmbuild/site/blog/plugins/widgets/_public.php:14
PHP   8. dcCore->callBehavior() /home/rpmbuild/site/blog/plugins/widgets/_default_widgets.php:88
PHP   9. call_user_func_array() /home/rpmbuild/site/blog/inc/core/class.dc.core.php:304
PHP Warning:  Parameter 1 to dcAntispam::purgeOldSpam() expected to be a reference, value given in /home/rpmbuild/site/blog/inc/core/class.dc.core.php on line 304
PHP Stack trace:
PHP   1. {main}() /home/rpmbuild/site/blog/index.php:0
PHP   2. require() /home/rpmbuild/site/blog/index.php:22
PHP   3. dcCore->callBehavior() /home/rpmbuild/site/blog/inc/public/prepend.php:122
PHP   4. call_user_func_array() /home/rpmbuild/site/blog/inc/core/class.dc.core.php:304

J'ai réussi à corriger les 2 erreurs bloquantes qui permettent d'avoir un fonctionnement correct mais pas de supprimer tous les warnings.

Correctif proposé :

diff -ru -i --exclude cache /tmp/blog/inc/clearbricks/dblayer/dblayer.php blog/inc/clearbricks/dblayer/dblayer.php
--- /tmp/blog/inc/clearbricks/dblayer/dblayer.php	2008-11-01 00:43:15.000000000 +0100
+++ blog/inc/clearbricks/dblayer/dblayer.php	2009-04-12 08:10:05.000000000 +0200
@@ -614,7 +614,7 @@
 	{
 		if (isset($this->__extend[$f]))
 		{
-			array_unshift($args,$this);
+			array_unshift($args,&$this);
 			return call_user_func_array($this->__extend[$f],$args);
 		}
 		
diff -ru -i --exclude cache /tmp/blog/plugins/widgets/class.widgets.php blog/plugins/widgets/class.widgets.php
--- /tmp/blog/plugins/widgets/class.widgets.php	2008-11-01 00:43:12.000000000 +0100
+++ blog/plugins/widgets/class.widgets.php	2009-04-12 09:11:11.000000000 +0200
@@ -144,7 +144,7 @@
 	public function call($i=0)
 	{
 		if (is_callable($this->public_callback)) {
-			return call_user_func($this->public_callback,$this,$i);
+			return call_user_func($this->public_callback,&$this,$i);
 		}
 		return '<p>Callback not found for widget '.$this->id.'</p>';
 	}

J'ai bien essayé de forcé le passage par référence lors de l'appal à callBehavior, mais ça ne fonctionne pas...

A suivre...

Hors ligne

#2 2009-04-12 07:49:53

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

Bon, en fait, le correctif est plutôt stupide, puisqu'il provoque des alertes...

PHP Deprecated:  Call-time pass-by-reference has been deprecated in /home/rpmbuild/site/blog/inc/clearbricks/dblayer/dblayer.php on line 617
PHP Deprecated:  Call-time pass-by-reference has been deprecated in /home/rpmbuild/site/blog/plugins/widgets/class.widgets.php on line 147

grr..

Sinon pour le callBehavior, une solution crade / de brute (mais qui supprime les warnings)

	public function callBehavior($behavior,&$par1=NULL,&$par2=NULL)
	{
		if (isset($this->behaviors[$behavior]))
		{
			$res = '';
			
			foreach ($this->behaviors[$behavior] as $f) {
				$res .= call_user_func($f,$par1,$par2);
			}
			
			return $res;
		}
	}

Bon, il y a encore du boulot...
Je me demande si c'est une régression de php 5.3.0 qui devrait être rapportée upstream ou juste un nouveau signalement qui détecte un comportement déjà existant (copie forcée des objets, perte de l'optimisation du passage par référence).

+

Hors ligne

#3 2009-04-12 07:52:46

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

Un début d'explication trouvé dans http://wiki.php.net/doc/scratchpad/upgrade/53

If a function with by-reference parameters is called by value ( for example with call_user_func_array) a warning message is produced and all by-reference parameters are set to NULL. In older versions, the function was called with by value parameters.

+

Hors ligne

#4 2009-04-12 08:02:10

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

Bon désolé pour le flood....

diff -ru -i --exclude cache /tmp/blog/inc/clearbricks/dblayer/dblayer.php blog/inc/clearbricks/dblayer/dblayer.php
--- /tmp/blog/inc/clearbricks/dblayer/dblayer.php       2008-11-01 00:43:15.000000000 +0100
+++ blog/inc/clearbricks/dblayer/dblayer.php    2009-04-12 09:59:57.000000000 +0200
@@ -614,7 +614,8 @@
        {
                if (isset($this->__extend[$f]))
                {
-                       array_unshift($args,$this);
+                       array_unshift($args,0);
+                       $args[0]=&$this;
                        return call_user_func_array($this->__extend[$f],$args);
                }
                
diff -ru -i --exclude cache /tmp/blog/inc/core/class.dc.core.php blog/inc/core/class.dc.core.php
--- /tmp/blog/inc/core/class.dc.core.php        2008-11-01 00:43:15.000000000 +0100
+++ blog/inc/core/class.dc.core.php     2009-04-12 09:48:40.000000000 +0200
@@ -291,17 +291,14 @@
        @param  behavior        <b>string</b>   Behavior name
        @return <b>string</b> Behavior concatened result
        */
-       public function callBehavior($behavior)
+       public function callBehavior($behavior,&$par1=NULL,&$par2=NULL)
        {
                if (isset($this->behaviors[$behavior]))
                {
-                       $args = func_get_args();
-                       array_shift($args);
-                       
                        $res = '';
                        
                        foreach ($this->behaviors[$behavior] as $f) {
-                               $res .= call_user_func_array($f,$args);
+                               $res .= call_user_func($f,$par1,$par2);
                        }
                        
                        return $res;
diff -ru -i --exclude cache /tmp/blog/plugins/widgets/class.widgets.php blog/plugins/widgets/class.widgets.php
--- /tmp/blog/plugins/widgets/class.widgets.php 2008-11-01 00:43:12.000000000 +0100
+++ blog/plugins/widgets/class.widgets.php      2009-04-12 10:00:59.000000000 +0200
@@ -144,7 +144,7 @@
        public function call($i=0)
        {
                if (is_callable($this->public_callback)) {
-                       return call_user_func($this->public_callback,$this,$i);
+                       return call_user_func_array($this->public_callback,array(&$this,$i));
                }
                return '<p>Callback not found for widget '.$this->id.'</p>';
        }

=> 0 warning, même en mode strict.
+

Hors ligne

#5 2009-04-12 09:35:18

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Dotclear et PHP 5.3.0

Il y a un ticket qui date de la version alpha de PHP 5.3 : http://dev.dotclear.org/2.0/ticket/382#comment:2

Hors ligne

#6 2009-06-22 17:17:21

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

Pas de nouvelle ?

La version 5.3.0 finale devrait sortir d'ici quelques jours (mercredi prochaine)

+

P.S. : source : http://marc.info/?l=php-internals&m=124562434701701&w=2

Hors ligne

#7 2009-06-23 05:42:49

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

Le support de php 5.3 fait partie des chantiers en cours.


Dyslexics have more fnu!

Hors ligne

#8 2009-07-19 17:42:27

llaumgui
Membre
Lieu : Le Crès, France
Inscription : 2006-06-07
Site Web

Re : Dotclear et PHP 5.3.0

Ca va faire un mois que la 5.3 est sortie... Existe t'il une version SVN pour tester la compatibilité ? Car le trunk ne bouge plus.

Hors ligne

#9 2009-07-19 18:01:58

Moe
Responsable du mini-bar
Lieu : France
Inscription : 2004-09-19
Site Web

Re : Dotclear et PHP 5.3.0

Tu connais un hébergeur qui l'a passé en production ?

Pour le reste : http://fr.dotclear.org/blog/post/2009/0 … .1.5#c4511

Bonnes vacances à tout le monde. :)

Hors ligne

#10 2009-07-20 08:52:18

llaumgui
Membre
Lieu : Le Crès, France
Inscription : 2006-06-07
Site Web

Re : Dotclear et PHP 5.3.0

Ceux qui ont un serveur dédié et qui ont besoin des fonctionnalité de php 5.3 ;-).

Hors ligne

#11 2009-07-20 09:03:37

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

Quelqu'un pourrait-il juste tester ces 2 petits hacks, sur un php 5.3, et me dire s'il y a d'autres warnings ?

Dans inc/clearbricks/dblayer.php, remplacer :

public function __call($f,$args)
	{
		if (isset($this->__extend[$f]))
		{
			array_unshift($args,$this);
			return call_user_func_array($this->__extend[$f],$args);
		}

Par :

public function __call($f,$args)
	{
		if (isset($this->__extend[$f]))
		{
			array_unshift($args,$this);
			$Args=array();
			foreach ($args as $k => &$value) $Args[$k]=&$value;
			return call_user_func_array($this->__extend[$f],$Args);
		}

Et dans inc/core/class.dc.core.php, remplacer :

	public function callBehavior($behavior)
	{
		if (isset($this->behaviors[$behavior]))
		{
			$args = func_get_args();
			array_shift($args);
			
			$res = '';
			
			foreach ($this->behaviors[$behavior] as $f) {
				$res .= call_user_func_array($f,$args);
			}
			
			return $res;
		}
	}

Par :

	public function callBehavior($behavior)
	{
		if (isset($this->behaviors[$behavior]))
		{
			$args = func_get_args();
			array_shift($args);
			$res = '';
			$Args=array();
			foreach ($args as $k => &$value) $Args[$k]=&$value;
			
			foreach ($this->behaviors[$behavior] as $f) {
				$res .= call_user_func_array($f,$Args);
			}
			
			return $res;
		}
	}

Dyslexics have more fnu!

Hors ligne

#12 2009-07-20 09:19:43

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Dotclear et PHP 5.3.0

Bonjour Dsls
Je doit justement installer dotclear2 sur un hébergement avec php 5.3 donc je veux bien tester.
Juste une question : ton hack concerne quel version ( svn ou stable ? ).


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#13 2009-07-20 09:25:00

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

adjaya a écrit :

Bonjour Dsls
Je doit justement installer dotclear2 sur un hébergement avec php 5.3 donc je veux bien tester.
Juste une question : ton hack concerne quel version ( svn ou stable ? ).

A priori les 2, mon général :)

J'ai juste commencé à expérimenter dans un coin, je ne garantis pas que ça fonctionne bien. En revanche, tout feedback sera le bienvenu.


Dyslexics have more fnu!

Hors ligne

#14 2009-07-20 13:11:35

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

Autre modification, dans plugins/widgets/class.widgets.php

Remplacer :

	public function call($i=0)
	{
		if (is_callable($this->public_callback)) {
			return call_user_func($this->public_callback,$this,$i);
		}
		return '<p>Callback not found for widget '.$this->id.'</p>';
	}

Par :

	public function call($i=0)
	{
		if (is_callable($this->public_callback)) {
			return call_user_func_array($this->public_callback,array(&$this,&$i));
		}
		return '<p>Callback not found for widget '.$this->id.'</p>';
	}

Dyslexics have more fnu!

Hors ligne

#15 2009-07-20 17:43:01

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

A mon avis, la modif proposée en #11 pour callBehavior pourait avoir des effets bizarres...

En effet tu crée une référence sur la copie de l'objet passé lors de l'appel...
Bon, d'un autre coté comme avant PHP ignorait simplement le passage par référence, ça peut marcher...

+

Hors ligne

#16 2009-07-21 06:10:15

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

RemiCollet: en effet, le hack est assez moche, mais je ne suis pas sûr de pouvoir faire autrement. La détermination des passages par référence/valeur est plutôt obscure en php lorsque ces références sont dans des tableaux, et complètement à l'ouest quand ces tableaux sont passés par des arguments de fonctions, puis en indirection via call_user_func_array.

Le workaround proposé n'est pas de moi, il est évoqué sur la doc de php : http://fr.php.net/manual/en/function.ca … -array.php (2e commentaire). En gros, ça "tombe en marche" ...


Dyslexics have more fnu!

Hors ligne

#17 2009-07-31 14:43:25

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

Mon blog http://blog.famillecollet.com/ fonctionne désormais avec PHP 5.3.0 est les correctifs proposés ci-dessus.

Pour ceux qui veulent les corrections au format patch : http://blog.famillecollet.com/public/Patches/blog.patch

RAS pour le moment.

+

Hors ligne

#18 2009-07-31 14:45:24

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

Le patch 'officiel' sera plus propre au final, mais aura des implications pour les plugins et certains thèmes.

En gros, cela va impliquer pas mal de changements de signature de méthodes.


Dyslexics have more fnu!

Hors ligne

#19 2009-07-31 16:23:01

zeiram
Membre
Inscription : 2004-06-27
Site Web

Re : Dotclear et PHP 5.3.0

Et quand peut-on espérer avoir une version beta pour vérifier que nos plugins fonctionnent correctement ? (Car en l'état, cela génère vraiment trop de warnings et d'erreurs...)


« Y a des jours où faut pas m'chercher !! Et y a des jours tous les jours ! »

Hors ligne

#20 2009-07-31 16:27:47

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Dotclear et PHP 5.3.0

J'attends juste que le nouveau chef crée la branche qui va bien sur le svn, et je remonte le tout :)


Dyslexics have more fnu!

Hors ligne

#21 2009-10-04 07:51:14

RemiCollet
Membre
Lieu : Champagne...
Inscription : 2009-03-06
Site Web

Re : Dotclear et PHP 5.3.0

La version 2.1.6 n'est toujours pas compatible PHP 5.3.

Le même correctif s'applique toujours et fonctionne parfaitement.

Version adaptée (juste la numérotation des lignes) :
http://blog.famillecollet.com/public/Pa … c216.patch

J'ai vraiment du mal à comprendre pourquoi ce patch n'est pas appliqué :(

Ok, c'est juste un correctif permettant de contourner le problème et je comprends que la "bonne" correction nécessite de revoir le prototype des fonctions de rappels, mais il marche.

En espérant qu'il serve à d'autres et qu'on aura rapidement une version compatible PHP 5.3

+

Hors ligne

#22 2009-10-04 09:35:56

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Dotclear et PHP 5.3.0

Ca vient, ça vient...

Ca bouge beaucoup du côté des sorciers qui veulent faire quelque chose de très propre et de très robuste (je n'y connais pas assez pour émettre un jugement sur ton patch, ce n'est donc pas une critique sur ta démarche et ce que tu proposes).

Par contre va surement y avoir du tangage du côté des plugins "externes" et chaque développeur va devoir s'en préoccuper.

Hors ligne

#23 2009-10-04 15:12:15

xave
Président
Lieu : commun
Inscription : 2004-05-06
Site Web

Re : Dotclear et PHP 5.3.0

Bonjour,

Le patch n'est pas appliqué parce que, tu le dis toi-même, c'est une rustine. Ça peut paraître vieux jeu, mais nous préférons garder un code propre et régler les problèmes correctement.

Faire les choses proprement, pour la compatibilité PHP 5.3, ça veut dire faire une revue complète du code. Nous avons déjà pas mal bossé dessus, mais vu les risques d'effets de bord que ça induit, ça a été fait parallèlement à la 2.1.6. Nous avons encore quelques tests à faire sur ce travail là et ça sera sans doute très bientôt inclus dans les nightlies.


xave, asocial assez atypique (©Koz) , en 15ème année de http://xave.org/
RTFM. / Je ne lis pas la LOL-langue. / Je suis un gars désagréable, ne me parlez pas.

Hors ligne

#24 2010-01-22 08:37:48

Malbrouck
Membre
Inscription : 2008-02-06
Site Web

Re : Dotclear et PHP 5.3.0

Cher Remi, merci pour ce patch ainsi que tes RPMs qui m'ont plusieurs fois servi.

Grâce a ton patch j'ai réussi a faire fonctionner dotclear sur mon mac mini snow leopard server 10.6.2 qui vient avec php 5.3.


Je n'ai qu'un seul probème: la création des miniatures dans le gestionnaire de médias. C'est un sujet qui a fait couler beaucoup d'encre dans le forums ou les gens découvrent que c'est normal que sous un système type Unix les fichiers commencant par un point sont cachés et qui se termine en général par "j'ai changé les droits des répertoires, ca marche".
Donc mon problème est que lorsque j'importe une image dans le gestionnaire de médias, l'image est correctement importée mais les miniatures ne sont pas créées. Ensuite, lorsque je clique le lien de l'image pour accéder à l'onglet "détails du média", je peux créer les miniatures en appuyant sur le bouton "mettre à jour les miniatures".

Donc en gors je peux créer les miniatures manuellement et ce que je voudrais c'est qu'elles soient créées automatiquement lors de l'imporation des images.


Quelqu'un a-t-il déja rencontré ce problème? Est-ce que cela peut être dû au patch php 5.3 ? Au plug-in gallery ?


Note: je ne peux pas donner l'URL de mon blog qui est privé et protégé par mot de passe.

Hors ligne

#25 2010-04-22 07:35:14

impossiblium
Membre
Inscription : 2008-12-17

Re : Dotclear et PHP 5.3.0

Hello !

PHP 5.3.2 est sorti depuis un bon moment.
Le chantier de la migration vers PHP 5.3 a t'il avancé ?
Peut-on avoir un état des lieux ?
J'ai en effet migré vers php 5.3.2 l'un de mes serveurs dédiés car j'ai besoin de cette version pour un développement personnel.
Du coup, mon blog (http://blog.mageekbox.net) l'a assez mal vécu.
J'ai corrigé les problèmes à l'arrache et tout semble fonctionner (, mais en conséquence, je suis en attente d'une version "clean".

A+

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map