【问题标题】:Running Zend Framework on PHP 5.1.6 - patch or fix for ksort()?在 PHP 5.1.6 上运行 Zend Framework - 修补或修复 ksort()?
【发布时间】:2011-03-22 11:50:40
【问题描述】:

我使用 1.10 构建了一个 ZF 应用程序,用于部署在企业客户端的 RHEL 服务器上,该客户端具有 PHP 5.1.6。它不会运行。

我用谷歌搜索,现在意识到它是 PHP 的版本。我没有意识到 ZF 对 PHP 5.2.4 有最低要求,并且对 HeadLink 的调用似乎导致了致命错误“调用未定义的方法 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

客户端不会升级他们的 PHP;我不想在没有 ZF 的情况下重写应用程序,而且我宁愿不将 ZF 降级到更早的版本。

是否有一些补丁可以用来将 ksort() 添加到 ZF 1.10 以解决这个问题?可能还有其他问题,但这是我现在卡住的地方。

欢迎任何建议

非常感谢

伊恩

编辑:正如我在下面的评论中所说,我预计很多人之前已经达到了这一点,并将继续这样做,因为 RHEL5 将在未来的好时机成为企业环境中的标准。我希望有一个指向现有解决方案的链接,而不是从头开始设计一个。

更新:我在接受的答案中使用了链接到的补丁,它为我解决了问题。

这是在 Zend/View/Helper/Placeholder/Container/Abstract.php 中添加以下公共方法

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

还有一个问题;由 Zend_View_Helper_Doctype 中的字符串转换引起的 PHP 通知。将此函数与上面和下面的类似函数进行比较,这似乎是库中的错误

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

改为:

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

修补库本身是我通常会做的最后一件事,但在这种情况下,它让我失去了一个位置。我们将确保在 repo 中对补丁进行版本控制,并为未来的开发人员明确记录。

【问题讨论】:

  • 感谢 PHP 5.3 出色的 FastCGI 支持,您或许可以说服客户端并行安装 5.3。您应该能够将 Apache 配置为仅将 FastCGI 5.3 用于相关站点,同时将所有其他站点留在服务器上(此处为盲目假设)运行 5.1.6 和 mod_php。不将此作为答案发布,因为它有点远。
  • @Charles - 谢谢,一个巧妙的解决方法!我怀疑他们会这样做,但如果他们咬人的话,提及这种可能性并没有什么坏处。

标签: php zend-framework rhel


【解决方案1】:

我今天遇到了同样的问题。 我在blog post 中找到了解决方案。

在/Zend/View/Helper/Placeholder/Container/Abstract.php中添加如下sn-p:

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

【讨论】:

  • +1 但核心问题仍然存在:你不知道还有多少不兼容。
  • @deceze - 核心问题是 ZF 团队在他们的象牙塔中决定打破与早期 PHP 版本的兼容性,因为完全知道有很多生产环境,就像这里讨论的那样他们无法更改已安装的 PHP 版本,否则他们将失去 Red Hat 及其托管服务提供商的支持保证。他们不会升级 PHP,因此替代方案是修补 ZF 以在没有 ZF 的情况下工作或重写应用程序。你更愿意在我的位置上做什么?
  • @Flubba 补丁的问题在于很难知道何时完成。您将需要进行大量测试以确保您修补了所有缺失的需求。我并不是说这不是解决方案,我只是指出了缺点。你被困在一个非常糟糕的地方,所以你需要权衡所有的利弊。将应用程序移植到旧版本的 ZF 有多难?这可能是一项具有更好定义范围的任务。
  • @deceze - 谢谢...我不同意你对缺点的评价。我会考虑将 ZF 降级到较早的版本,但目前修补工作较少且时间紧迫。这个资源看起来很有用:zfcompat.wolf-u.li,但它实际上并没有显示 Zend_View_Helper 所需的最低版本,所以需要加点盐。感谢您的回答;我赞成它,但接受了另一个,因为它与实际代码相关联。感谢您的帮助!
【解决方案2】:

我想您可以更改Zend_View_Helper_Placeholder_ContainerZend_View_Helper_Placeholder_Container_Abstract 的继承以提供您自己的ArrayObject::ksort 实现。比如:

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


abstract class Zend_View_Helper_Placeholder_Container_Abstract
extends CompatibilityArrayObject {
    ...
}

你不知道还有多少问题。如果要求说 PHP 5.2.4,那就是你应该运行它。

【讨论】:

  • 谢谢,这就是我想知道的事情。但我敢肯定,很多人都在这条船上找到了自己。 RHEL 5 将在未来成为许多企业环境中的标准。我希望有人可以指导我找到完整的解决方案;我不想重新发明轮子来扩展 ZF,因为毕竟 ZF 的全部目的是避免重新发明轮子
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多