2010-11-11 57 views
5

我有一个需要在C++库中调用函数的PHP Web应用程序。这个库是由供应商提供的(在Linux机器上是libfoo.a)。从PHP Web应用调用C++库:system()vs SWIG PHP extension?

  1. 我的第一反应是创建一个C++可执行针对libfoo.a链接,并通过命令行参数的函数。 PHP web应用程序然后可以对我的C++可执行文件执行system()调用。这将很容易实现。我担心的是,是否会为每次调用创建新的系统进程会增加很多开销。这个开销是多少?

  2. 另一种方法是我可以使用SWIG将C++函数包装到PHP扩展中,但我没有C++源代码。 SWIG支持与“.a”库链接吗?它是否需要我团队中的其他工程师更改其PHP配置以构建libfoo.a?

如果系统的开销()调用小(< 30毫秒),我宁愿选择#1,因为它似乎要简单得多,一旦创建C++可执行文件,它不建立到PHP应用。你对这两种选择有什么建议?

+0

你是否需要'C++'输出?如果不是你可以考虑推动呼吁背景 - http://stackoverflow.com/questions/45953/php-execute-a-background-process – ajreal 2010-11-11 20:11:49

+0

只是一个简单的外部观察,但不知道多久会被称为,它听起来你会更好地制作C++可执行文件(这将允许在PHP之外使用作为奖励)。如果你把它扩展成PHP扩展,那么我认为即使只是一个小型的私人用户群,你也不可避免地面临分发和兼容性维护的噩梦。自从你打开这个问题以来,你有没有试过或发现过什么? – 2011-04-05 22:29:26

回答

0

不知道你做了什么,最后,但我年前做了一个简单的PHP 包装扩展调用C++库。像这样,你不会有系统调用的开销。我不是你的问题,但你会更好地控制对lib的调用。例如,将包装加载到内存中,而不是在每次调用时加载它,保留自定义配置参数等。我依赖于lib的性质。

只是一些参考,可能会感兴趣:

0

我会推荐选项2.我没有使用PHP/SWIG的经验,但对perl,java和PLSQL(oracle)做了同样的事情。我们将用一些C/C++编写一些核心功能(并使用第三方库),然后将它们封装在适当的包装中。

我们这样做主要是因为我们没有在三种应用程序语言中重复核心功能。使用C的效率是一个额外的好处。使用这样的包装(在我看来)比用系统“脱壳”更安全,因为您可以传递适当的参数并将值作为与解析标准输出的混乱业务相对的变量返回。

要点要记住:

  • 您将需要使用的应用程序语言提供了一些功能(PHP你)分配任何内存为新的数据。例如在Perl的NewSV。
  • 通常有告诉PHP在哪里可以找到所需的一些配置已编译的.so/.dll文件
1

我的例子会建议使用一些IPC(进程间通信)协议。如果你要这么写使用库的C++应用程序 - 写一些通信协议(使用TCP/IP或Unix套接字),并启动应用程序作为守护

看到man 3 daemonman 2 forkUnix sockets guide

附:建立图书馆到PHP不是一个好主意 - C++不是像PHP那样的故障安全。如果库或php模块崩溃 - 整个web服务器崩溃或在最好的情况下,一个服务器进程崩溃。如果你将它和程序/库崩溃,你可以显示错误信息(甚至发送警报邮件),如果你的web服务器出现故障,这种情况不会发生。

2

请记住,C++ vs C生产不同的函数名称,因此不同的DLL函数名称具有相同的功能,这意味着不同的链接。

“第三方扩展提供程序必须重建它们的扩展,使它们与我们现在提供的Visual Studio C++ 9版本兼容和加载。”