2010-07-29 26 views
4

J'ai construit une application ZF en utilisant 1.10 pour le déploiement sur le serveur RHEL dans un client d'entreprise, qui a PHP 5.1.6. Ça ne marchera pas.L'exécution de Zend Framework PHP 5.1.6 - patch ou correctif pour ksort()?

Je googlé et il est maintenant réaliser la version de PHP. Je ne savais pas que ZF avait une exigence minimale pour PHP 5.2.4, et appelle à HeadLink semblent causer une erreur fatale « Appel à la méthode non définie Zend_View_Helper_Placeholder_Container :: ksort() »:

PHP Fatal error: Call to undefined method Zend_View_Helper_Placeholder_Container::ksort() in /library/ Zend/View/Helper/HeadLink.php on line 321 

Le client a gagné » t mettre à jour leur PHP; Je ne veux pas réécrire l'application sans ZF, et je préfère ne pas rétrograder ZF à une version grossièrement antérieure.

Est-il un correctif que je peux utiliser pour ajouter ksort() à ZF 1.10 pour contourner cela? Il y a peut-être d'autres problèmes, mais c'est là où je suis coincé en ce moment.

Tous les conseils de bienvenue

Un grand merci

Ian

EDIT: Comme je l'ai dit dans un commentaire ci-dessous, je pense beaucoup de gens ont frappé cette avant et continueront à le faire que RHEL5 sera une norme dans les environnements d'entreprise pour un bon moment à venir. J'espérais un lien vers une solution existante plutôt que d'en concevoir un à partir de zéro.

MISE À JOUR: je le patch lié à la réponse acceptée et elle a fixé le problème pour moi.

C'est la méthode publique ajoutant à la suite Zend/View/Helpers/Placeholder/Container/Abstract.php

/** 
* Sort the array by key 
* 
* @return array 
*/ 
public function ksort() 
{ 
    $items = $this->getArrayCopy(); 
    return ksort($items); 
} 

Il y avait une question qui reste; un avis PHP provoqué par une conversion de chaîne dans Zend_View_Helper_Doctype. En comparant cette fonction à d'autres semblables ci-dessus et ci-dessous, cela semble être une erreur dans la bibliothèque

public function isHtml5() { 
    return (stristr($this->doctype(), '<!DOCTYPE html>') ? true : false); 
} 

Changé à:

public function isHtml5() { 
    return (stristr($this->getDoctype(), '<!DOCTYPE html>') ? true : false); 
} 

Patcher la bibliothèque elle-même était la dernière chose que je devrais normalement faire, mais dans ce cas, il m'a fait sortir d'un endroit. Nous nous assurerons que le patch est versionné dans le repo et documenté de toute évidence pour les futurs développeurs.

+1

Merci à PHP excellent support FastCGI de 5.3, vous pourriez être en mesure de convaincre le client de faire une installation parallèle de 5.3. Vous devriez pouvoir configurer Apache pour utiliser FastCGI 5.3 pour juste le site en question, tout en laissant tous les autres sites sur le serveur (supposition aveugle ici) fonctionnant en 5.1.6 avec mod_php. Ne pas afficher cela comme une réponse parce que c'est un peu long. – Charles

+0

@Charles - merci, une solution de contournement ingénieuse! Je doute qu'ils le feraient mais il n'y a pas de mal à mentionner la possibilité au cas où ils mordraient. – Polsonby

Répondre

6

J'ai eu le même problème aujourd'hui. J'ai trouvé la solution dans cette blog post.

Ajouter l'extrait suivant dans /Zend/View/Helper/Placeholder/Container/Abstract.php:

/** 
* Sort the array by key 
* 
* @return array 
*/ 
public function ksort() 
{ 
    $items = $this->getArrayCopy(); 
    return ksort($items); 
} 
+0

+1 Mais le problème principal reste: vous ne savez pas combien il y a d'incompatibilités. – deceze

+0

@deceze - le problème principal est que l'équipe ZF de leur tour d'ivoire a décidé de rompre la compatibilité avec les versions antérieures de PHP, sachant qu'il existait de nombreux environnements de production comme celui-ci où ils ne peuvent pas changer la version PHP ou ils perdent les garanties de support de Red Hat et de leur hébergeur. Ils ne vont pas mettre à jour le PHP, donc les alternatives sont patch ZF pour fonctionner ou réécrire l'application sans ZF. Que préféreriez-vous faire à ma place? – Polsonby

+0

@Flubba Le problème avec les correctifs est qu'il est difficile de savoir quand c'est fait. Vous aurez besoin de faire beaucoup de tests pour vous assurer que vous avez corrigé toutes les exigences manquantes. Je ne dis pas que ce n'est pas la solution, je ne fais que souligner les inconvénients. Vous êtes coincé dans un mauvais endroit, vous devez donc peser tous les avantages et les inconvénients. Dans quelle mesure serait-il difficile de porter l'application sur une ancienne version de ZF? Cela peut être une tâche avec une meilleure portée définissable. – deceze

2

Je suppose que vous pouvez modifier l'héritage de Zend_View_Helper_Placeholder_Container ou Zend_View_Helper_Placeholder_Container_Abstract pour fournir votre propre implémentation de ArrayObject::ksort. Quelque chose comme:

class CompatibilityArrayObject extends ArrayObject { 
    public function ksort() { 
     // here be dragons 
    } 
} 


abstract class Zend_View_Helper_Placeholder_Container_Abstract 
extends CompatibilityArrayObject { 
    ... 
} 

Vous ne savez pas combien d'autres problèmes, il y a cependant. Si l'exigence dit PHP 5.2.4, c'est ce que vous devriez l'exécuter.

+0

merci, c'est le genre de chose que je me demandais. Mais je suis sûr que beaucoup de gens se retrouvent dans ce bateau; RHEL 5 va être la norme dans de nombreux environnements d'entreprise pour un bon moment à venir. J'espérais que quelqu'un pourrait me diriger vers une solution complète; Je ne veux pas réinventer la roue en prolongeant ZF, puisque après tout le but de ZF est d'éviter de réinventer la roue. – Polsonby