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

时间:2012-03-30 02:39:43

标签: php c++

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

P.S。我不是很擅长C ++。

11 个答案:

答案 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 ++编写扩展名。)

因此,除非您的速度要求非常严格,否则使用execproc_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,请检查这些链接

exec Function

link for background processes in windows

对于Linux:

system Function

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++