PHP和C++之间能够相互传递数据吗?

14

我的PHP脚本中有很多数学计算,有时会相当缓慢。 我想知道是否可能将数据从PHP传递到C++,在C++中进行计算,然后将结果传回PHP?

附注:我不太擅长C ++。


2
最简单的方法是编译一个C++可执行文件,然后从PHP中调用它。 - James M
我应该使用哪个函数?另外,PHP如何将数据传递给C++? - Leo Jiang
使用参数调用它。我不确定是否有任何东西可以告诉你main()的返回值。编辑:似乎exec具有该功能。 - chris
你能否在PHP和C++中都使用套接字? - andre
11个回答

19

您可以编写一个PHP模块, 这是一段暴露新的内置函数给PHP解释器的C代码。这比通过exec()启动第二个进程要快得多。

然而,这样的模块很难编写,构建工具很笨拙,并且在PHP和C之间传递参数需要非常小心地处理内存分配和引用计数。此外,C不是C ++,因此您需要在C ++代码周围添加一个extern C层,以将函数导出到PHP中。(否则,请改用C而不是C ++编写扩展程序。)

因此,除非您的速度要求真的非常严格,否则最好使用execproc_open,并通过文件指针来回传递数据。这就像编写从标准输入读取并输出到标准输出的C ++程序一样。


7
如果你不经常运行计算,那么我会像Oleksi所说的那样使用PHP的exec()命令来运行外部的C++应用程序来完成工作。
但是,如果你频繁地运行计算,比如每秒几次,那么C++应用程序的初始执行时间可能会产生惩罚;然后你可以考虑使用一个C++服务/应用程序,它监听一个套接字或文件管道,从中传递数据在PHP和C++之间。这将节省EXE的启动时间。

7

3
你可以使用这种方法来提高性能,这是改善性能关键代码的常见解决方案。你可以使用C++创建一个命令行应用程序,并使用PHP的exec命令(或类似命令)来执行它。
至于传递数据,你有几个选项。如果数据量很大,你可以使用PHP将其放入文件中,并从C++中访问该文件。如果数据量较小,则可以在运行C++程序时通过命令行参数传递。

3
为了提供另一种选择,如果您需要同时进行多个可以并行运行的计算,那么使用Gearman可能会对您有很大帮助。
Gearman将负责与C ++通信,并且您可以同时运行多个计算。 Gearman本身只是一个组件,允许您将其作为任务服务器进行通信,并编写连接到其上以执行实际工作的工作程序。这还允许您进行扩展,例如,如果您需要计算某些大型数据,则可以启动20个AWS EC2实例,并在其中运行工作程序来完成繁重的工作,然后在完成后关闭它们。
对于直接且不需要并行执行的最佳性能,我会完全使用Crashworks方法,或者您可以混合使用两种方法。

1

0

对于 *ux 系统,您可以在例如 Apache 中将 C++ 应用程序作为 CGI 脚本启动。

Apache: C/C++ script(根据此参考资料,它也可能在 Windows 上可用)。

在这种情况下,您只需将 HTML 表单设置为在 CGI 脚本上进行提交(例如)。

我已在 Linux 和 Apache 2 上进行了测试,通过 HTTP 进行协调非常容易。


0
如果您想异步处理这些内容,可以看一下 Beanstalkd,它可以作为一个作业队列,存储数据块以供另一个进程进行处理。因此,您可以编写一个 C++ 进程,在那里等待要做的事情,并从 Beanstalkd 中拾取工作。Beanstalkd 不仅快速,而且还可以分布式使用。

有一些可用的 C(++) 客户端库 https://github.com/kr/beanstalkd/wiki/client-libraries 与 Beanstalkd 相关。


0
据我所知,最好的解决方案是用C++编写PHP扩展。
这样可以让您创建自己的“本地”PHP函数,您可以将其命名为my_func()。它将使用C++应用程序的速度执行您需要的所有计算,并将结果作为my_func()的输出返回给您。
您可能想查看这个问题:如何开始用C++编写PHP5扩展

0

使用C++创建一个可执行文件。使用proc_code将数据传递到/从该可执行文件中,并让该可执行文件执行计算。


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