C++ 和 PHP 之间的通用桥梁
Posted
技术标签:
【中文标题】C++ 和 PHP 之间的通用桥梁【英文标题】:Generic bridge between C++ and PHP 【发布时间】:2011-08-26 11:26:12 【问题描述】:我们有一个 Web 应用程序(相当重量级的应用程序),它包含一整套东西、Web 用户界面、数学处理和建模,以及与数据库相关的东西。
在 php 中发生的许多过程都非常缓慢,主要是因为 PHP 不适合数学处理。
在未来,我们希望打破这些缓慢的进程,并用更快的东西重写它们,可能是 C++,或者可能是 Java。
有谁知道将数据输入和输出 PHP 并输入到另一种语言环境的通用方法?我已经考虑过将内容序列化为 JSON 并将它们铲到 /dev/shm 或套接字中,然后让其他语言在套接字上侦听,或查看共享内存位置等。
这种东西对于原生类型很有效,但是当你考虑到很多被传递的东西实际上是类实例和类似的对象时,它确实很糟糕。
我不确定一个明智的解决方案,但我一直在考虑纯 Java 的 Quercus PHP 实现,以及 PHP/Java bridge. 但是,我一直无法为 C++ 找到可以执行类似功能的任何内容。编写一个 PHP 模块是可能的,但我正在努力看看它如何足够通用,而不仅仅是将每个新(和一些旧)脚本重写为一个模块,然后在 PHP 中调用这些函数。
【问题讨论】:
【参考方案1】:看看 Gearman:http://gearman.org/
它适用于 C 和 PHP,以及大量其他语言。虽然它没有明确说明 C++ :(
除了作为桥梁外,它还可以作为负载平衡器并提供系统冗余。
我自己没用过,不过感觉挺棒的:)
编辑:Gearman 会要求您序列化数据,所以在这方面是一个减号。
【讨论】:
【参考方案2】:我们目前正在使用 zend 框架在我们的 php 代码中调用 C++ 库。它可能是您正在寻找的。p>
干杯!
【讨论】:
【参考方案3】:Google protocol buffers
协议缓冲区
这是什么?
协议缓冲区是一种以高效且可扩展的格式对结构化数据进行编码的方法。 Google 几乎所有内部 RPC 协议和文件格式都使用协议缓冲区。
它支持对您以.proto
语言定义的对象进行快速高效的序列化,并且原生支持 C++/Java,以及带有第三方插件的 PHP。
【讨论】:
【参考方案4】:我最近偶然发现了 Hiphop 优化器。 Facebook 使用这个,它可能正是你所需要的,虽然我不能根据经验说话。 https://github.com/facebook/hiphop-php/wiki/
看看它是否适合你的需要:)
【讨论】:
它不适用于我们的应用程序。以前试过。它破坏了所有的命名空间,并巧妙地破坏了其他一些东西。【参考方案5】:我刚刚完成了“PHP 文件对象”的开发,这是一个第 10 层组件 Vettrasoft Z 目录。该对象允许调用 PHP 代码的“预处理”, 从 C++ 程序嵌入到文档中。应用程序代码看起来像 像这样:
int i;
file_o f_in("mytemplate.txt"), f_out("my_output.txt");
rec_dbag_o bag;
phpfile_o my_php (f_in);
for (i=0; i < 9; i++)
my_php.process(f_out, bag);
// --do something with 'f_out' (PHP generated output file)--
这里的想法是输入文件(上例中的'f_in')是一个“模板” 包含 PHP 代码的文件(或只是一个直接的 PHP 文件)。生成的输出去 进入“f_out”[上图]。通常这将是一个循环。数据包中的数据 ('bag', above) 提供给 PHP 处理器(databags 是 Vettrasoft 的替代品 到 XML),从而将数据从 C++ 应用程序传输到 PHP 代码。
与提到的一些替代方案不同,您只需将程序链接到 Z 目录 图书馆。但是,它确实需要原生 PHP 'CLI' [命令行界面] 处理器 (一个“SAPI”程序)在同一台机器上(如果你可以做“http://localhost/somfile.php”,你 可能已经配置了 PHP)。
这实际上是 Z 目录的最新添加,截至撰写本文时(2012 年 6 月 27 日), 尚未发布,我们称其为“C++/PHP 桥”。它今天刚刚通过了 alpha 并将包含在下一个版本 (ZP9/b13) 中 - 大约在 7 月中旬。一位朋友指出了这一点 在 ***.com 上发帖,因为时间如此紧迫,我读到这篇文章令人瞠目结舌 巧合。
【讨论】:
以上是关于C++ 和 PHP 之间的通用桥梁的主要内容,如果未能解决你的问题,请参考以下文章