CentOS下使用SWIG为PHP53开发扩展

37 篇文章 0 订阅
Date: 2016-01-28
Author: kagula
Environment:
[1]CentOS 6.5 64bits

[2]PHP 5.3.3(CentOS默认自带的PHP)以FCGI方式运行。

    PHP 5.3.29 以Apache Module方式运行。

[3]Nginx 1.8.2
[4]Swig 3.0.8
[5]CMake 3.4.1
[6]spawn-fcgi
Abstract:

  介绍如何用C和C++语言在CentOS上通过SWIG为PHP5.3编写扩展,因为是动态加载方式,所以只适合PHP5.3及以前版本



Content:
假设你已经安装PHP、Nginx、CMake。


Nginx(PHP)文档根目录“ /usr/share/nginx/html”。
PHP默认的扩展目录“ /usr/lib64/php/modules
在我计算机上的访问地址:http:// 192.168.218.130/
其中“192.168.218.130”是我CentOS虚拟机的地址。


安装swig
yum install pcre pcre-devel
从www.swig.org下载 swig-3.0.8.tar.gz并安装。
默认安装位置在“ usr/local/bin”。


查看swig版本
swig -version


编译我们的第一个C语言工程


把下面的源文件
......./swig-3.0.8/Examples/php/simple
复制到/root/simple下


现在转到“/root/simple”目录下。
为这个路径添加CMakeLists.txt文件,文件内容如下
#设置项目名称
PROJECT(simple)


#要求CMake的最低版本为2.8
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)


INCLUDE_DIRECTORIES(/usr/include/php)
INCLUDE_DIRECTORIES(/usr/include/php/main)
INCLUDE_DIRECTORIES(/usr/include/php/Zend)
INCLUDE_DIRECTORIES(/usr/include/php/TSRM)


AUX_SOURCE_DIRECTORY(. DLL_SRC)


ADD_LIBRARY(simple SHARED ${DLL_SRC})

用下面的命令让swig根据example.i产生php stub文件。
swig -php example.i
在当前项目路径下新产生了 php_example.hexample_wrap.cexample.php三个文件。
其中前面两个文件用来编译“ libsimple.so”文件。
example.php复制到“ /usr/share/nginx/html


在当前simple目录下新建子目录 build,进入build子目录用“ CMake ..”命令编译simple。
如果编译成功的话会在build子目录生成so文件。
把编译出来的“ libsimple.so”复制到“ /usr/lib64/php/modules”路径下。
使用下面的命令可以看到已经编译成了64位lib文件。
readelf -a /usr/lib64/php/modules/libsimple.so


vim /etc/php.ini
php.ini配置:
enable_dl=On
extension_dir ="/usr/lib64/php/modules/"
extension=libsimple.so



参考下面的命令,重启FCGI PHP。
netstat -ntlp|grep 9000
kill <php fcgi 进程号>
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000  -f /usr/bin/php-cgi -P /var/run/fastcgi-php.pid



在“/usr/share/nginx/html”目录下新建kagula.php文件
用来测试我们刚编译出来的php扩展库。
下面是kagula.php文件的清单
<?php
 include 'example.php';
 
 echo 'example::gcd(43214,64) '.example::gcd(43214,64)."<br/>";
 example::Foo_set('abcdef');
 echo 'example::Foo_get() '.example::Foo_get()."<br/>";
 echo 'example::print_Foo(); '.example::print_Foo()."<br/>";
?>


在“/usr/share/nginx/html”中直接用下面的命令查看php运行有没有语法错误。
php kagula.php


如果没有问题,可以通过下面的地址访问
http://192.168.218.130/kagula.php


/var/log/nginx下可以看到nginx的输出日志。


编译我们的第一个C++语言工程
新建weesoo文件夹
里面我新建了weesoo.hpp、weesoo.cpp、weesoo.i、CMakeLists.txt四个文件

weesoo.hpp文件清单

#ifndef _WEESOO_H_
#define _WEESOO_H_

#include <string>
#include <vector>
using namespace std;

vector<string> GetHttp(vector<string> vecHttp);

#endif

weesoo.cpp文件清单

#include "weesoo.hpp"

vector<string> GetHttp(vector<string> vecHttp)
{
	vector<string> vecResult;

	for (int i = 0; i < vecHttp.size();i++)
	{
		string temp("[[");
		temp.append(vecHttp[i]);
		temp.append("]]");

		vecResult.push_back(temp);
	}
	return vecResult;
}

weesoo.i文件清单

%module weesoo
%include "std_string.i"  
%include "std_vector.i"  
  
%{    
#include "weesoo.hpp"
%}    
  
namespace std {  
   %template(vectors) vector<string>;  
};  
  
%include "weesoo.hpp"

CMakeLists.txt文件清单

PROJECT(weesoo)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

INCLUDE_DIRECTORIES(/usr/include/php)
INCLUDE_DIRECTORIES(/usr/include/php/main)
INCLUDE_DIRECTORIES(/usr/include/php/Zend)
INCLUDE_DIRECTORIES(/usr/include/php/TSRM)

AUX_SOURCE_DIRECTORY(. DLL_SRC)

ADD_LIBRARY(weesoo SHARED ${DLL_SRC})

使用下面的swig命令

swig -c++ -php weesoo.i
产生 php_weesoo.hweesoo_wrap.cppweesoo.php三个文件
上面的“ -c++”参数用来通知SWIG我们的项目是“C++”语言项目,默认是“C”语言项目。


weesoo.php文件复制到“ /usr/share/nginx/html”。
在当前目录下新建build子目录,在子目录中使用“ cmake ..”命令编译出
libweesoo.so文件。
把“ libweesoo.so”复制到“ /usr/lib64/php/modules”中。
根据上面描述的知识修改php.ini文件,并重启php,使php能找到我们新的so文件。


在“ /usr/share/nginx/html”中新建 weesoo_test.php测试我们新的php扩展是否能正常工作。
下面是weesoo_test.php文件的清单
<?php
 include 'weesoo.php';
 
 $vecHttp = new vectors();
 $vecHttp->push("http://lj.6xiche.com/plate/detection/detect?url=http://lj.6xiche.com/plateimg/1EZ02.jpg");
 $vecHttp->push("http://lj.6xiche.com/plate/detection/detect?url=http://www.baidu.com");
 
 $vecJSON = weesoo::GetHttp($vecHttp); 
 for($x=0;$x<$vecJSON->size();$x++) {
  echo $vecJSON->get($x);
  echo "<br>";
 }
 
?>

先“ php  weesoo_test.php”命令没问题后

再在浏览器中访问“http://192.168.218.130/weesoo_test.php”也没有问题,就OK了。



注意
[1]为simple目录添加C语言源文件后,得清空build子目录后重新CMake,
否则 新添加的C语言源文件不会编译进去
[2]用下面的命令为php安装开发包。
yum install php-devel

[3]覆盖so文件后,php fcgi进程需要重启,否则php fcgi进程会崩溃。

[4]最新的SWIG是3.0.8版本,还不支持PHP7。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值