PHP调用C/C++动态链接库

摘要 有时候,单纯依靠 PHP “本身”是不行的。尽管普通用户很少遇到这种情况,但一些专业性的应用则经常需要将 PHP 的性能发挥到极致(这里的性能是指速度或功能)。由于受到 PHP 语言本身的限制,同时还可能不得不把庞大的库文件包含到每个脚本当中。因此,某些新功能并不是总能被顺利实现,所以我们必须另外寻找一些方法来克服 PHP 的这些缺点。 了解到了这一点,我们就到了应该接触一下 PHP 的心脏并探究一下它的内核——可以编译成 PHP 并让之工作的 C 代码——的时候了。 概述: PHP调用动态链接库几个必要步骤为: 1. C/C++编写动态链接库,编译打包成.so文件 2. 初始化一个新的PHP扩展 3. 配置、编写PHP扩展内容,在扩展中使用C/C++调用.so 4. 编译并添加PHP扩展 5. 在PHP应用中直接调用PHP扩展里暴露出来的API 为了从能运行的最简单的例子开始,所以下面的叙述可能不会严格按照上面列的步骤来写,也有可能会重复穿插着写。但总体顺序是一致的。 一. C/C++编写动态链接库,编译打包成.so文件 如果还不会用C++调用自己写的.so库,请参考我的这篇文章: http://keping.me/cpp_invoke_so/ 文中从什么是Name Mangling开始,到如何用调用一个包含简单函数的so库,再到如何从so中加载类,都有详细叙述,并附有可运行示例代码。 二. 初始化PHP扩展 本文中,我们将创建一个叫“vehicle”的PHP扩展,其中包含一个“Car”类。 将要创建的扩展会涉及到以下文件需要修改,这些文件将会出现在vehicle目录下。后面会一一叙述这些文件是怎么来的,现在只是大致了解一下。 car.h —— 包含了C++写的类,即Car的定义 car.cc —— Car类的具体实现 php_vehicle.h —— 包含了PHP创建扩展所需要的一些头文件,外部变量定义等。 vehicle.cc —— 扩展的主要源码文件,这里面会调用到Car类 config.m4 —— PHP扩展的配置文件 1. […]

PHP与C++性能比较

PHP是速度很快的脚本语言,但是用了框架以后好像感觉挺慢的。于是猜测会不会PHP本身也不是很快。如果不是很快,能否采用PHP调用本地动态链接库的形式来提升速度。 于是有了下面的对比实验。 测试环境 1. 硬件环境如下图所示。 2. 软件环境 系统: Ubuntu 12.10 gcc版本: Thread model: posix gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) php版本: PHP 5.3.22 (cli) (built: Mar 14 2013 20:37:16) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies php开发环境: LAMP,所有安装包均是通过源码编译安装而成,编译过程中会自动根据本机各项参数进行最优配置。性能比apt-get install命令直接安装好。 关于以源码包方式搭建LAMP请参考文章:http://keping.me/linux-php-dev-by-source-style/ 测试方法 由于冒泡排序在时间复杂度上相当稳定——O(n2),在最大程度上减少了数据可能带来的影响,故采取计算冒泡排序的运行时间的方法来进行此次实验。 对比测试分组 分组1: C++直接调用程序内的函数 分组2: C++调用打包好的动态链接库文件(.so文件,该文件也是自己写好并打包) 分组3: PHP直接调用程序内的函数 […]

Ubuntu下PHP扩展cURL

开发php的时候遇到一个错误, Fatal error: Call to undefined function curl_init() Google了一下,网上基本都是你抄我,我抄你,还不能解决,我勒个擦。还是自己动手吧,结合以前经验,解决方法如下: 0. 前提。我的php开发环境是用源码包编译、安装而成的。并且保留了php的源码包。 1. 安装cURL。 1.1 进入/usr/local/src目录,命令如下: $ cd /usr/local/src 1.2 下载cURL源码包,可以通过命令下载,也可以直接去http://curl.haxx.se/download/选择版本下载,然后copy到该目录。如果是敲命令,如下: $ sudo wget http://curl.haxx.se/download/curl-7.17.1.tar.gz 1.3 配置。在当前目录下执行命令: $ sudo ./configure –prefix=/usr/local/curl 1.4 编译,命令如下: $ sudo make 1.5 安装,命令如下: $ sudo make install 如果安装成功以后,在/usr/local/curl/目录下将生成bin、include、lib和share四个目录。 2. 扩展php。 2.1 进入php源码包(不是安装以后的)位置/ext/curl/目录,我的在/usr/local/src/php-5.3.22/ext/curl,如下图所示 2.2 在当前目录下,通过phpize可以建立php的外挂模块,命令如下: $ sudo /usr/local/php/bin/phpize 其中/usr/local/php/是我的php安装路径,有可能与各位不一样。 2.3 配置扩展,命令如下: $ sudo ./configure –with-php-config=/usr/local/php/bin/php-config […]

Ubuntu搭建LAMP环境(jpeg-6b 安装错误 ,找不到libtool命令)

继续安装php开发环境, jpeg-6b make的时候错误: ./libtool –mode=compile gcc -O2 -I. -c ./jcapimin.c make: ./libtool: Command not found make: *** [jcapimin.lo] Error 127 看提示应该是没有安装libtool,由于才拿到手里的服务器,什么都没装,出现这个错误也正常。 解决办法:安装libtool 1 在上面的链接或者网上下载 libtool-2.2.6a.tar.gz,放到/usr/local/src/目录下,解压软件包到当前目录libtool-2.2.6下,并进入libtool-2.2.6目录,命令如下: $ cd /usr/local/usr/                                      // 进入源码包所在目录 $ sudo tar zxvf libtool-2.2.6a.tar.gz        […]

ubuntu下PHP安装pdo_mysql扩展

在linux下使用yii框架的时候,遇到一个错误 “CDbConnection failed to open the DB connection: could not find drive ” google了一下,然后去/yii路径/requirements/index.php确认了是由于PDO MYSQL extension 没有安装的原因(PDO MYSQL extension 后面出现了Warning)。 解决方法: 1.进入php源码包中的/etc/pdo_mysql目录,我的在 cd /usr/local/src/php-5.3.22/ext/pdo_mysql  在当前目录执行phpize(在php的安装路径里的bin/目录里,我的在 /usr/local/src/php-5.3.22/ext/pdo_mysql$  /usr/local/php/bin/phpize 2.配置 在当前目录下执行 ./configure –with-php-config=/usr/local/php/bin/php-config –with-pdo-mysql=/usr/local/mysql 其中/usr/local/mysql是我的mysql安装目录 3.编译安装 make一下,然后make install 安装成功以后,会在/usr/local/php/lib/php/extensions/no-debug-zts-20090626目录有pdo_mysql.so文件 其中no-debug-non-zts-20090626可能会根据你下的php源码包不同而有所不同,如no-debug-non-zts-20050922等 4.修改配置文件 修改php.ini文件,添加扩展语句 extension=”/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so” 5.重启apache,完成。 6.在phpinfo中就可以看到扩展成功 7.在yii的/requirements/index.php中也可以看到Warning变成了Passed

Yii框架Register模块开发流程

本文用以下五个步骤来详细介绍: 1. 用gii创建所需Module, Model, Controller,Crud以及Form 2. 注册界面显示部分(以下则以access模块作为例子讲解) 3. 编辑逻辑部分代码 4. 修改Controller 5. 总结 一. 用gii创建所需Module, Model, Controller,Crud以及Form 在浏览器输入地址http://127.0.0.1/icampus/sns/index.php?r=gii进入gii界面,输入密码123456,进入可视化代码生成工具页面。按照module -> model -> controller -> crud -> form 的顺序分别生成代码。 1.选择Module Generator,在Module ID输入框中输入模块名称access(为了演示这里输入的是access2,以后类同),点击Preview,确认没错以后点击Generate即可生成代码。 然后可以在icampus\sns\protected\modules文件夹下看到生成的access2文件夹。  2.把上图中代码部分添加到\icampus\sns\protected\config\main.php中的modules数组里面,以便可以访问,如下图所示。 3. 点击Model Generator,参照下图的输入,填入所需内容,如表名前缀icp_access;注册所需要用的表示user,所以Table Name这里填入icp_access_user;Model Class可自定义,不妨用AccessUser2来创建;然后输入正确的Model Path。 至此model也建立好了,可以在icampus\sns\protected\modules\access2文件夹下看到多出来一个model文件夹,里面有model文件AccessUser2.php 4. 点击Controller Generator,参照下图所示,填写具体输入框。Controller ID这里填写module名称/model名称,即access2/AccessUser2 然后点击Generate,即会在模块的controller文件夹(icampus\sns\protected\modules\access2\controllers)下生成AccessUser2Controlller.php 5. 点击Crud Generator,参考下图填写 然后点击Generate即可 6. 点击Form Generator,参考下图填写各个输入框 点击Generate即可生成所需要的form页面。然后会提示将下列代码添加到controller中。 打开AccessUser2Controlller.php,将上述方法复制进去即可。 至此,注册模块所有需要自动生成的步骤已经完成。注意:最好按顺序来(module -> model -> controller -> crud […]