PHP和C++可以在彼此之间传递数据吗

Can PHP and C++ pass data between each other?

本文关键字:数据 彼此之间 C++ PHP      更新时间:2023-10-16

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

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

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

然而,这样的模块很难编写,构建工具也很笨拙,而且在PHP和C之间来回传递参数需要非常注意内存分配和引用计数。此外,C不是C++,因此您需要在C++代码周围有一个extern C层来将函数导出到PHP。(或者用C而不是C++编写扩展。)

因此,除非您的速度要求非常高,否则使用execproc_open并通过文件指针来回传递数据会更容易。这就像编写一个从标准输入读取并向标准输出发出信号的C++程序一样。

如果您运行计算的频率比Oleksi说的要低;使用PHP的exec()命令来运行外部C++应用程序,该应用程序将完成这项工作。

但是,如果密集地运行计算,比如每秒运行几次时,C++应用程序的初始执行时间可能会受到惩罚
然后,您可以考虑拥有一个C++服务/应用程序,它侦听套接字或文件管道,在PHP和C++之间从中/向中传递数据。这将节省EXE的启动时间。

您可以始终使用Facebooks HipHop编译代码。

它将把php转换成C++,然后使用g++将其编译成机器代码。

https://github.com/facebook/hiphop-php/wiki/

https://github.com/facebook/hiphop-php/wiki/Running-HipHop

我个人从未在真正的项目中使用过它,但我听到过很棒的东西。

您可以这样做,这是提高性能关键代码性能的常见解决方案。您可以用C++创建一个命令行应用程序,并使用PHP的exec命令(或类似命令)执行它。

至于传递数据,您有几个选择。如果是大量数据,可以使用PHP将其放在一个文件中,然后从C++访问该文件。如果数据较少,您可以在运行C++程序时简单地传入命令行参数。

要提供另一种选择,如果您必须同时进行多个可以并行运行的计算,那么实际上可能会对您有很大帮助的方法是使用Gearman。

Gearman将负责和C++对话,您可以同时运行多个计算。Gearman本身只是一个组件,它允许您作为任务服务器与它进行对话,并编写连接到它以执行实际工作的工作人员。这也允许你扩大规模,比如说你有一些大的东西要计算,你可以启动20个AWS EC2实例,让工人在那里进行繁重的吊装,然后在完成后关闭他们。

为了获得最佳性能,如果它是直接的,并且不需要并行执行,我会100%使用Crashworks方法,或者你可以将两者混合使用。

是的,可以完成:

PHP可以在服务器上运行命令。

对于WINDOWS和LINUX系统,过程是不同的

对于窗口检查这些链接

exec函数

windows 中后台进程的链接

对于Linux:

系统功能

在后台中运行进程

我试着利用这个过程并取得了一些成功。

还有一件事,你也可以获取结果

在C++中创建一个可执行文件。使用proc_code向该可执行文件传递数据,并让该可执行执行文件进行计算。

php函数系统()可以完成这项工作。只需将编译后的c++文件传递给system(),即可获得返回的结果。

例如,对于*ux系统,您可以在apache中以CGI脚本的形式启动C++应用程序。

Apache:C/C++脚本(可能在windows上也可用,正如我在本参考资料中看到的那样)。

在这种情况下,您只需将HMTL表单设置为在CGI脚本上发布(例如)。

我已经在Linux和Apache2中进行了测试,它非常容易通过HTTP进行协调。

如果你想异步处理这些,你可以看看Beanstalkd,它充当一个作业队列,存储要由另一个进程提取的数据块进行处理。因此,您可以编写一个C++进程,它坐在那里等待做什么,并从Beanstalkd中获取工作。Beanstalkd不仅速度快,而且可以分布式。

beanstalkd有几个C(++)客户端库可用https://github.com/kr/beanstalkd/wiki/client-libraries.

据我所知,最好的解决方案是用C++编写PHP扩展。

这使您可以创建自己的"原生"PHP函数,并将其命名为my_func()。它将以C++应用程序的速度完成您需要的所有计算,并将结果作为my_func()的输出返回。

您可能想看看这个问题:如何开始在C++中编写PHP5扩展