【问题标题】:How to load two versions of the same php extension?如何加载相同 php 扩展的两个版本?
【发布时间】:2012-12-14 15:02:03
【问题描述】:

我正在开发的 Web 应用程序需要能够处理同一个 PHP 扩展的两个不同版本。 (特别是 MapServer 5.6 的 MapScript 和 Mapserver 6.2 的 MapScript。)

在开始执行 php 之前,脚本不会知道需要加载两个版本中的哪一个。 (但每个请求只需要一个扩展。)

我原本打算使用php内置dl功能,但我发现dl因为安全问题被禁用了。 (http://php.net/manual/en/function.dl.php)

在执行期间是否有任何安全的方式来加载扩展程序?或者也许总是同时加载两者,但将它们放在不同的命名空间中以便可以单独访问它们?

【问题讨论】:

  • 除非扩展支持命名空间,否则你可能不支持。没有机制可以加载插件/模块并将它们填充到与默认命名空间不同的命名空间中,例如dl('v1.so', \this\that).
  • 如果你不能重新编译这两个扩展,并且如果你只需要加载它们来执行一些测试,那么有一个 header 可以唯一标识一个扩展,你可以使用一个二进制编辑器来更改扩展名出现在里面的一个字母,也将函数名更改为 1 个字母(并且还要在任何地方重命名文件名)。免责声明:我自己没有尝试过。

标签: php php-extension


【解决方案1】:

我给了这个问题 +1,因为这是一个很好的问题,问得很好。

但是,我无法想象会有一个答案可以满足您的需求。如果扩展在版本之间不向后兼容,那么它显然设计得不好,很难看出 PHP 是如何负责的。

我能想到的最佳解决方案是使用两个单独的 php.ini 或 .htaccess 文件,指定两个单独的扩展版本。从您的 Web 服务器运行的 PHP 程序会根据它们所在的目录选择不同版本的扩展。

例如,http://myserver/newmaps/program.php 将运行新版本的扩展,http://myserver/oldmaps/program.php 将运行旧版本的扩展。

那么你只需要在两个目录中有相同的程序。如果它检测到它没有得到它需要的扩展版本,它可以发出一个 http 重定向来加载另一个版本。

【讨论】:

  • 感谢您的回复。当我问的时候,我担心没有优雅的解决方案。我会考虑你的建议,但我怀疑它可能比它的价值更复杂。
猜你喜欢
  • 2019-09-25
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多