如何加载同一php扩展的两个版本?

5
我正在开发的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) - Marc B
如果您无法重新编译这两个扩展,并且只需要加载它们来执行一些测试,则有一个标头可以唯一标识扩展,您可以使用二进制编辑器更改扩展名称出现的字母,同时将函数名称也更改为1个字母(并且还要在所有地方重命名文件名)。免责声明:我自己没有尝试过。 - Déjà vu
1个回答

2

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

然而,我无法想象会有一个答案能够做到你想要的。如果扩展程序在版本之间不兼容,那么它显然设计得不好,很难看出PHP如何对此负责。

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

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

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


谢谢您的回复。当我提问时,我担心没有优雅的解决方案。我会研究您的建议,但我怀疑它可能比它值得的更加复杂。 - alexwells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接