我的PHP脚本中有很多数学计算,有时可能会非常慢。我想知道是否可以将数据从PHP传递到C ++,用C ++进行计算,然后将结果传递回PHP?
P.S。我不是很擅长C ++。
答案 0 :(得分:19)
You can write a PHP module,它是PHP解释器的a piece of C code that exposes a new built-in函数。这比通过exec()
启动第二个流程要快得多。
但是,这些模块很难编写,构建工具很笨拙,在PHP和C之间来回传递参数需要非常小心内存分配和引用计数。此外,C不是C ++,因此您需要围绕C ++代码的extern C
层将函数导出到PHP。 (或者用C而不是C ++编写扩展名。)
因此,除非您的速度要求非常严格,否则使用exec
或proc_open
并通过文件指针来回传递数据会更容易。这就像编写一个从标准输入读取并发送到标准输出的C ++程序。
答案 1 :(得分:7)
如果你运行的计算不那么频繁,那么就像Oleksi所说的那样;使用PHP的exec()命令运行外部C ++应用程序,它将完成工作。
但是,如果你强烈地运行计算,比如每秒几次,那么C ++应用程序的初始执行时间可能会受到处罚;
然后你可以看看有一个C ++服务/应用程序,它可以侦听套接字或文件管道,从而在PHP和C ++之间传递数据。这将节省EXE的启动时间。
答案 2 :(得分:7)
您总是可以使用Facebook HipHop编译代码。
它会将你的php转换为C ++,然后使用g ++将其编译为机器代码。
https://github.com/facebook/hiphop-php/wiki/
https://github.com/facebook/hiphop-php/wiki/Running-HipHop
我从未在一个真实的项目中亲自使用它,但我听到了很棒的东西。
答案 3 :(得分:3)
您可以这样做,这是提高性能关键代码性能的常用解决方案。您可以使用C ++创建命令行应用程序,并使用PHP的exec
命令(或类似的命令)执行它。
至于传递数据,你有几个选择。如果它是大量数据,您可以使用PHP将其放入文件中,并从C ++访问该文件。如果数据较少,则可以在运行C ++程序时简单地传入命令行参数。
答案 4 :(得分:3)
要提供另一种替代方案,如果您必须同时进行多次并行运行,那么实际上甚至可以帮助您的方法就是使用Gearman。
Gearman将负责与C ++的交谈,您可以同时运行多个计算。 Gearman本身只是一个组件,它允许您作为任务服务器与它交谈,并且您编写连接到它的工作人员来执行实际工作。这也允许你扩展,比如你有大量的东西要计算,你可以启动20个AWS EC2实例并在那里运行工人来完成繁重的工作,然后在完成之后关闭它们。
为了获得最佳性能,如果它不是直接的并且不需要并行执行,我会使用Crashworks方法100%,或者你可以将两者混合使用。
答案 5 :(得分:1)
是的,可以这样做:
PHP可以在服务器上运行命令。
WINDOWS和LINUX系统的过程不同
对于Windows,请检查这些链接
link for background processes in windows
对于Linux:
Running a process in background
我尝试使用这个过程并取得一点成功。
还有一件事你也可以抓住结果
答案 6 :(得分:0)
使用C ++创建可执行文件。使用proc_code向/从该可执行文件传递数据,并获取该可执行文件以进行计算。
答案 7 :(得分:0)
php function system()可以完成这项工作。只需将已编译的c ++文件传递给system()并获取返回的结果即可。
答案 8 :(得分:0)
对于* ux系统,您可以在apache中启动C ++应用程序作为CGI脚本。
Apache: C/C++ script(也可以在Windows上使用,正如我在此参考中所见)。
在这种情况下,您只需将HMTL表单设置为在CGI脚本上发布(例如)。
我已经在Linux和Apache 2中进行了测试,通过HTTP进行协调非常容易。
答案 9 :(得分:0)
如果要异步处理这些,可以查看Beanstalkd作为作业队列,存储要由另一个进程处理的数据块。因此,您可以编写一个C ++进程,在那里等待某些事情要做,然后从Beanstalkd中获取工作。 Beanstalkd不仅速度快,而且还可以分发。
有一些用于beanstalkd的C(++)客户端库可用https://github.com/kr/beanstalkd/wiki/client-libraries。
答案 10 :(得分:0)
据我所知,最好的解决方案是用C ++编写PHP扩展。
这使您可以创建自己的“本机”PHP函数,您将命名为my_func()。它将以C ++应用程序的速度完成您需要的所有计算,并将结果作为my_func()的输出返回。
您可能需要查看此问题:How to start writing a PHP5 extension in C++