Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
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
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
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
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
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
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
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
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. :)
- les règles du forum : http://forum.dotclear.net/viewtopic.php?id=39494
- la galaxie de Dotclear 2 : http://fr.dotclear.org/documentation/2.0/links
Hors ligne
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
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
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
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
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
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
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
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
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
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
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.
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
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
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
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).