PHP和C++可以在彼此之间传递数据吗
Can PHP and C++ pass data between each other?
我的PHP脚本中有很多数学计算,有时会很慢。我想知道是否可以将数据从PHP传递到C++,在C++中进行计算,然后将结果传递回PHP?
附言:我不太擅长C++。
您可以编写一个PHP模块,这是一段C代码,它向PHP解释器公开了一个新的内置函数。这将比通过exec()
启动第二个进程快得多。
然而,这样的模块很难编写,构建工具也很笨拙,而且在PHP和C之间来回传递参数需要非常注意内存分配和引用计数。此外,C不是C++,因此您需要在C++代码周围有一个extern C
层来将函数导出到PHP。(或者用C而不是C++编写扩展。)
因此,除非您的速度要求非常高,否则使用exec
或proc_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扩展
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 线程之间的实时数据共享
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 在C++事务之间存储大量字符数据的有效方法
- 查找彼此之间具有不同最小距离的随机数
- 包括数据类型之间的斗争
- C++中类数据成员之间的通信
- 抽象数据类型(ADT)和数据结构之间有什么区别
- 复制n char*彼此之间
- PHP和C++可以在彼此之间传递数据吗
- 比较 c++ std::vector 的元素彼此之间
- 同步两个线程,在彼此之间传递事件
- 在数据子集之间进行选择
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突
- 不同的C/ c++模块在编译和链接时彼此之间有什么通信?
- 如何/应该在Qt中创建ui表单和数据成员之间的自动链接