用 C++ 扩展 PHP?

2024-03-16

我有一个用 PHP 编写的性能密集型例程,我想将其移植到 C++ 以提高性能。有没有办法使用 C++ 编写插件或扩展或其他东西并从 PHP 与之交互?无需手动编辑实际的 PHP 源代码?


As 莱姆斯 说 https://stackoverflow.com/questions/1110682/extending-php-with-c/1110760#1110760,您可以使用 Zend API 通过 C/C++ 扩展 PHP。链接教程由萨拉·戈尔蒙 http://devzone.zend.com/article/1021是一个好的开始,这本书扩展和嵌入 PHP https://rads.stackoverflow.com/amzn/click/com/067232704X同一作者更详细地介绍了该主题。

然而,值得注意的是,这两者(以及我在网上找到的几乎所有其他内容)都集中在 C 上,并没有真正涵盖让 C++ 扩展工作所需的一些调整。

In the config.m4您需要显式链接到 C++ 标准库的文件:

PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, PHP5CPP_SHARED_LIBADD)

任何 C++ 库编译检查config.m4文件还需要链接 C++ 库:

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
[
  AC_MSG_ERROR([lib $LIBNAME not found.])
],[
  -lstdc++ -ldl
])

编辑 - 以下是指定 g++ 的方法:

最后,为了在构建扩展时选择 C++ 而不是 C 编译器/链接器,6th参数为PHP_NEW_EXTENSION()应该"yes". ie:

PHP_NEW_EXTENSION(your_extension,
                  your_extension.cpp, 
                  $ext_shared, 
                  ,
                  "-Wall -Werror -Wno-error=write-strings -Wno-sign-compare",
                  "yes")

来自PHP构建系统手册 http://www.tufat.com/docs/php_manual/internals2.buildsys.configunix.html#internals2.buildsys.configunix.finishing,参数为:

  1. 扩展名
  2. 属于扩展的所有源文件的列表。
  3. (选修的)$ext_shared,当调用 PHP_ARG_WITH() 时由配置确定的值
  4. (可选)“SAPI 类”,仅对于专门需要 CGI 或 CLI SAPI 的扩展有用。在所有其他情况下,它应该留空。
  5. (可选)构建扩展时要添加到 CFLAGS 的标志列表。
  6. (可选)一个布尔值,如果“是”,将强制使用 $CXX 而不是 $CC 构建整个扩展。

我无法弄清楚如何让配置脚本将 g++ 设置为编译器/链接器而不是 gcc,因此最终使用 sed 命令破解 Makefile,在我的 bash 构建脚本中进行搜索替换:

phpize
./configure --with-myextension
if [ "$?" == 0 ]; then
# Ugly hack to force use of g++ instead of gcc
# (otherwise we'll get linking errors at runtime)
   sed -i 's/gcc/g++/g' Makefile
   make clean
   make
fi

大概有一个automake http://www.gnu.org/software/automake/命令将使这个黑客变得不必要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C++ 扩展 PHP? 的相关文章

  • PHP - 使用大量参数和默认值初始化对象的最佳方法

    我正在设计一个类 它定义一个高度复杂的对象 其中包含大量 50 大部分可选参数 其中许多参数都有默认值 例如 type foo width 300 interactive false 我试图确定设置构造函数和实例 类变量的最佳方法 以便能够
  • 公开 ASP.NET 用户控件中的复杂属性

    我想从自定义 ASP NET 用户控件公开一个复杂的属性 可以通过aspx页面中的控制标签来设置 像这样的事情 public class TestData public int X public int Y public partial c
  • Docker 应用程序更新后无法连接到数据库

    在我的公司 我有一个旧的 Symfony 应用程序在 Docker 容器中运行 该应用程序连接到一个 SQL 数据库 该数据库也在 Docker 容器内运行 该图像是使用 php 7 2 apache stretch 构建的 但该版本已不再
  • cron 作业或 PHP 调度程序

    我使用 MYSQL 作为我的数据库 PHP 作为我的编程语言 我想运行一个 cron 作业 该作业将运行直到当前系统日期与我的数据库表中名为 PROJECT 的 截止日期 日期 列匹配 一旦日期相同的是 必须运行更新查询 这会将状态 项目表
  • 无法使用 process.ErrorDataReceived c# 获取进程错误输出

    我已经建立了Form我使用了一段时间的应用程序 现在我想捕捉StandardError我的流程及其standartOutput 我查看了答案SO and MSDN https msdn microsoft com en us library
  • 如何接收在 PHP 中使用“application/octet-stream”发送的 POST 数据?

    这就是我正在处理的事情 我们的一个计划有一个支持表格 用户可以使用它来请求支持 此表单的作用是 它向 PHP 脚本执行 HTTP POST 请求 该脚本应该收集信息并将其转发到支持电子邮件地址 POST 请求包含三个类型的文本字段Conte
  • 在 PHP 中将数组转换为字符串并将其恢复为数组

    我正在使用 Serialize 函数将数组存储在我的 MYSQL 数据库中 然后我在其他页面中取消序列化他 数组结构如下所示 Array 0 gt Array names gt somename1 rating gt 10 1 gt Arr
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • 警告:sqlsrv_num_rows() 期望参数 1 为资源,给定布尔值[重复]

    这个问题在这里已经有答案了 出现此警告的原因有很多 但是 我认为我的问题是该表APPT为空 并且不包含任何内容row与t schedule id 我阅读了可能已经有答案的每个问题 并且所有答案都说明了同样的事情 您的 SQL 查询未成功并且
  • 如何在MVVM架构中将animationview play与LottieForms绑定?

    所以我在列表视图中处理动画 并且我想随时播放一次 所以我想控制它 这是图书馆https github com martijn00 LottieXamarin https github com martijn00 LottieXamarin
  • 包含不同类型的两个集合相交

    假设我有一个集合 称之为ids它是类型IEnumerable
  • 使用 ASP.NET Core Identity 将令牌保存在 Cookie 中

    我想在我的 身份 生成的 cookie 中保存一些内容 我目前正在使用文档中的默认身份设置 启动 cs services Configure
  • MVC Razor for 循环

    我有这段代码 嵌套在表单帖子内 但我不断收到错误 它缺少结束语 for int i 0 i lt itemsCount i
  • 将引用托管代码中分配的内存的指针传递给非托管代码

    我在 C 中分配了一个大的 char 缓冲区 并且希望将指向此数据的指针传递给 DLL 中的未管理的 c 函数 现在我认为要使其工作 必须修复字符缓冲区 以便 GC 在函数工作时无法移动它 如果是这样 我会声明缓冲区已固定并调用 UNSAF
  • 如何从与桌面交互的应用程序与 Windows 服务进行通信?

    使用 Net 与服务交互的最佳方式是什么 即大多数托盘应用程序如何与其服务器通信 如果这个方法也是跨平台的 那就更好了 在 Mono 中工作 所以我猜远程处理已经过时了 Edit 忘了说了 我们仍然需要在现场支持 Windows 2000
  • 非数字输入导致死循环

    由于某种原因 如果用户输入了错误的数据类型 例如 j 或 循环将停止要求输入并继续显示 Enter an integer gt 一遍又一遍 如何让程序处理错误的输入 为什么输入非数字值会导致如此奇怪的行为 define SENTINEL 0
  • Eclipse PHP IDE - 自定义自动完成标签

    Eclipse IDE 新手 想知道是否有一种方法可以添加自动完成 更改 这样如果我输入 mres 它会将其翻译为 mysql real escape string 我知道正常的 PHP 代码完成 但看不到任何有关创建自定义快捷方式的信息
  • OledbConnection.Dispose() 是否关闭连接? [复制]

    这个问题在这里已经有答案了 可能的重复 如果使用 using 子句 是否需要关闭 DbConnection https stackoverflow com questions 12033998 is there any need to cl
  • MDI 窗体中的子窗口对接

    我有一个 MDI 表单和其中的一些子表单 我将子窗体停靠到 MDI 窗口的不同区域 但是当任何子窗体失去焦点时 其他停靠的窗体将重新排列 由于混乱 我准备了一组图像来展示该行为 Image1 单击任何窗口之前 Image2 点击窗口2后 问
  • hreflang 应该如何构建?

    我的问题是 应该像上面的所有页面一样 或者应该用每个页面的实际 url 进行更改 例如

随机推荐