【问题标题】:How to build a PHP extension that runs in many PHP versions?如何构建在多个 PHP 版本中运行的 PHP 扩展?
【发布时间】:2014-07-06 19:35:21
【问题描述】:

我使用 C++ 创建了一个 PHP 扩展。我想以二进制形式将我的扩展发送给我的客户。这意味着我需要为每个 PHP 版本(5.2、5.3、5.4、5.5)和每个处理器架构构建一个单独的版本。

我的问题是:

  1. 为什么他们不断更新 API 时间戳,而 API 本身似乎没有改变?在升级您的系统以使用下一版本的 PHP 时,它不会消除很多麻烦吗?只是为了比较,我还有一个使用 XLL API 的 MS Excel 扩展版本,并且该 API 自 2003 年以来一直保持向后兼容,这使我的所有客户只有两个二进制文件(32 位和 64 位)。

  2. 有没有办法解决这个问题? IE。有没有办法构建一个可以在多个 PHP 版本中运行的 PHP 扩展?

【问题讨论】:

  • 有一个简单的解决方案:不要将其作为二进制文件分发。这也将使人们安装起来更加合理。除非您为一家受信任的大型软件公司工作,否则我当然不会在不知道它不包含任何内容的情况下使用二进制 PHP 扩展,例如,将所有用户名/密码条目发送回我的服务器服务器...
  • 我同意@Mats - 创建一个您的客户可以运行的 make 包。如果这不可能,您可以创建一个自动构建系统,为每个架构和版本交叉编译,并将二进制文件推送到您的下载站点。
  • @halfer,您能否详细说明我将如何创建这样一个系统?这会涉及在构建机器上安装多个 php5-dev 版本吗?顺便说一句,我正在(并为)Linux 上构建。
  • 是什么让您认为“API 没有改变”?您所描述的版本发生了一些相当重大的变化。
  • 这是我的猜测,显然是错误的。无论如何,我对我的问题的“为什么”部分不太感兴趣,但我很想听听任何关于解决这个问题的建议。在这一点上,我的“交叉编译器”由几个虚拟机组成,每个虚拟机带有 Debian 6 和 7 的两个位。关于如何以全自动方式完成此操作的任何想法?

标签: php c++


【解决方案1】:

也许您可以尝试混合方法。单独编译您的 C++ 库,然后为此创建一个开源 PHP 扩展包装器。 PHP 扩展几乎没有自己的逻辑。它将数据类型从 PHP 到 C/C++ 来回转换,并将参数传递给 C++ 库中实现的函数/方法。

然后,您只需为每个平台维护一个二进制版本的库,而特定 PHP 版本的采用由开源 PHP 扩展完成。

这当然要求您客户的系统确实安装了 PHP 开发包以及编译器。

【讨论】:

  • 这可能真的有效。我的大多数客户都乐于从网上获取资源并运行 make。谢谢!很好的答案!
  • (差不多 4 年后)我已经使用这个解决方案大约两年了,但后来遇到了静态库在不同 gcc 版本和操作系统之间不兼容的问题。所以我切换到发布源代码。这也不理想,因为 C++ 编译器确实不同。但至少编译器错误比“找不到一些晦涩的符号”错误更容易理解和修复。
猜你喜欢
  • 2020-08-19
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多