Date: 2016-01-28
Author: kagula
Environment:
[1]CentOS 6.5 64bits
[4]Swig 3.0.8
[5]CMake 3.4.1
[6]spawn-fcgi
Abstract:
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文件,文件内容如下
用下面的命令让swig根据example.i产生php stub文件。
swig -php example.i
在当前项目路径下新产生了 php_example.h、 example_wrap.c、 example.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文件的清单
在“/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.cpp文件清单
weesoo.i文件清单
CMakeLists.txt文件清单
使用下面的swig命令 swig -c++ -php weesoo.i
产生 php_weesoo.h、 weesoo_wrap.cpp、 weesoo.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 weesoo_test.php”命令没问题后
注意
[1]为simple目录添加C语言源文件后,得清空build子目录后重新CMake,
否则 新添加的C语言源文件不会编译进去。
[2]用下面的命令为php安装开发包。
yum install php-devel
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.h、 example_wrap.c、 example.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.h、 weesoo_wrap.cpp、 weesoo.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。