关于尝试开发PHP的MYSQL扩展的使用
开发MYSQL扩展,当然得先安装MYSQL
下载mysql-essential-5.1.65-win32
这个扩展的目的主要是熟悉ZENDAPI,并且理解如何提供PHPAPI。
实现的PHPAPI有:
PHP_FUNCTION(my_mysql_connect);
PHP_FUNCTION(my_mysql_close);
PHP_FUNCTION(my_mysql_get_conn);//通过链接池获取mysql资源,这个连接池只是简单的自动扩容,并没有收缩。
PHP_FUNCTION(my_mysql_select_db);//切换数据库
PHP_FUNCTION(my_mysql_ping);
PHP_FUNCTION(my_mysql_query);//执行sql,可以是SELECT或INSERT、UPDATE、DELETE等有返回值与无返回值的查询语句
PHP_FUNCTION(my_mysql_fetch_assoc);//获取返回结果集
PHP_FUNCTION(my_mysql_get_insert_id);//获取上一次执行INSERT的自增ID
二、开发思路
1.通过ext_skel_win32.php(骨架工具)创建my_mysql扩展。
2.使用VS2008打开my_myqsl.dsp,编辑项目属性。
2.1切换为Release版本,默认是DEBUG版本
2.2右键项目属性-》通配属性-》C/C++-》预处理器-》预处理器定义除去其中的ZTS=1,因为我们将编译为NTS版本。(非线程安全)
2.3右键项目属性-》通配属性-》C/C++-》常规-》附加包含目录,新增MYSQL_ROOT\include。引入头文件搜索路径。
这样当使用#include"mysql.h"时,就不会出现搜索不到头文件的错误
2.4右键项目属性-》通配属性-》链接器-》常规-》附加库目录,新增MYSQL_ROOT\lib\opt,编译扩展时需要链接的DLL都在其中。(另外不要忘记引入php5nts.lib的路径,这是任一扩展编译时都需要引入的)
2.5右键项目属性-》通配属性-》链接器-》输入-》附加依赖项新增libmySQL.lib,意在编译时设定需要链接的DLL。
3.新建my_mysql新的PHP资源类型。
4.实现PHPAPI,供给PHP接口使用。
5.编译扩展,拷贝生成的php_my_mysql.dll到PHP_ROOT\ext下,并修改php.ini,增加extension=ext\php_my_mysql.dll。
6.编写PHP文件,调用扩展中提供的函数并调试。
@MYSQL_ROOT:表示mysql的安装路径
@PHP_ROOT:表示php所在路径
三、开始编码
ext\my_mysql\php_my_mysql.h
/*
+----------------------------------------------------------------------+
|PHPVersion5 |
+----------------------------------------------------------------------+
|Copyright(c)1997-2012ThePHPGroup |
+----------------------------------------------------------------------+
|Thissourcefileissubjecttoversion3.01ofthePHPlicense, |
|thatisbundledwiththispackageinthefileLICENSE,andis |
|availablethroughtheworld-wide-webatthefollowingurl: |
|http://www.php.net/license/3_01.txt |
|IfyoudidnotreceiveacopyofthePHPlicenseandareunableto |
|obtainitthroughtheworld-wide-web,pleasesendanoteto |
|license@php.netsowecanmailyouacopyimmediately. |
+----------------------------------------------------------------------+
|Author: |
+----------------------------------------------------------------------+
*/
/*$Id$*/
#ifndefPHP_MY_MYSQL_H
#definePHP_MY_MYSQL_H
externzend_module_entrymy_mysql_module_entry;
#definephpext_my_mysql_ptr&my_mysql_module_entry
#ifdefPHP_WIN32
# definePHP_MY_MYSQL_API__declspec(dllexport)
#elifdefined(__GNUC__)&&__GNUC__>=4
# definePHP_MY_MYSQL_API__attribute__((visibility("default")))
#else
# definePHP_MY_MYSQL_API
#endif
#ifdefZTS
#include"TSRM.h"
#endif
PHP_MINIT_FUNCTION(my_mysql);
PHP_MSHUTDOWN_FUNCTION(my_mysql);
PHP_RINIT_FUNCTION(my_mysql);
PHP_RSHUTDOWN_FUNCTION(my_mysql);
PHP_MINFO_FUNCTION(my_mysql);
PHP_FUNCTION(my_mysql_connect);
PHP_FUNCTION(my_mysql_close);
PHP_FUNCTION(my_mysql_get_conn);
PHP_FUNCTION(my_mysql_select_db);
PHP_FUNCTION(my_mysql_ping);
PHP_FUNCTION(my_mysql_query);
PHP_FUNCTION(my_mysql_fetch_assoc);
PHP_FUNCTION(my_mysql_get_insert_id);
/*
DeclareanyglobalvariablesyoumayneedbetweentheBEGIN
andENDmacroshere:
*/
ZEND_BEGIN_MODULE_GLOBALS(my_mysql)
long max_connection;
long default_connection;
char*driver_name;
char*host;
char*pwd;
char*user;
longport;
ZEND_END_MODULE_GLOBALS(my_mysql)
/*Ineveryutilityfunctionyouaddthatneedstousevariables
inphp_my_mysql_globals,callTSRMLS_FETCH();afterdeclaringother
variablesusedbythatfunction,orbetteryet,passinTSRMLS_CC
afterthelastfunctionargumentanddeclareyourutilityfunction
withTSRMLS_DCafterthelastdeclaredargument. Alwaysreferto
theglobalsinyourfunctionasMY_MYSQL_G(variable). Youare
encouragedtorenamethesemacrossomethingshorter,see
examplesinanyotherphpmoduledirectory.
*/
#ifdefZTS
#defineMY_MYSQL_G(v)TSRMG(my_mysql_globals_id,zend_my_mysql_globals*,v)
#else
#defineMY_MYSQL_G(v)(my_mysql_globals.v)
#endif
#endif /*PHP_MY_MYSQL_H*/
接口测试test.php
<?php
//$mysql=my_mysql_connect("localhost","root","","test",3306);
//var_dump($mysql);
////my_mysql_close($mysql);
//sleep(10);
$conn=array();
$conn[]=my_mysql_get_conn();
$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//$conn[]=my_mysql_get_conn();
//print_r($conn);
var_dump($conn[0]);
//my_mysql_select_db($conn[0],"test");
//mysql_query("showprocesslist",$conn[0]);
//print_r($status);
//sleep(1);
my_mysql_select_db($conn[0],"mysql");
//sleep(1);
my_mysql_select_db($conn[1],"test");
my_mysql_ping($conn[1]);
$result=my_mysql_query($conn[1],"select*fromtest");
var_dump($result);
$arr=my_mysql_fetch_assoc($result);
my_mysql_query($conn[1],"INSERTINTOtestVALUES(id,"abc")");
$insert_id=my_mysql_get_insert_id($conn[1]);
print_r($arr);
echo$insert_id;
测试结果:
相关文章
- soapclient php 扩展,PHP扩展—SOAP[通俗易懂]
- MySQL Error number: MY-010024; Symbol: ER_DD_METADATA_NOT_FOUND; SQLSTATE: HY000 报错 故障修复 远程处理
- 技术实现的网络系统PHP和MySQL结合:搭建网络系统的利器.(基于php和mysql)
- 探索 MySQL 数据库编码原理(查看mysql编码)
- 快速连接:PHP与MySQL的数据库通信(php链接mysql数据库)
- MySQL中的锁记录机制(mysql锁记录)
- PHP与MySQL网站开发实操指南(php和mysql开发)
- 数据PHP操作MySQL:删除数据(php删除mysql)
- MySQL多主同步技术实现高可用性(mysql多主同步)
- MySQL: Handling Binary Data Efficiently(mysql二进制数据)
- PHP中的MySQL转义码简介(php转义mysql)
- 阿里巨头MySQL主从同步技术获重大突破。(阿里mysql主从)
- 扩展MySQL中的二进制数据扩展应用(mysql二进制数据)
- 利用PHP实现MySQL数据库操作的简易指南(php实现mysql)
- PHP连接MySQL数据库失败的解决方案(php连接mysql失败)
- 坚持不懈:用PHP实现MSSQL数据库连接(php链接mssql函数)
- 文件MySQL导入备份文件的简易操作(mysql 导入 bak)
- 一步步学习Linux退出Mysql(linux退出mysql)
- 如何使用CDH监控MySQL数据库(cdh监控mysql)
- MySQL间的三台数据库同步(3个mysql之间同步)
- CMD无法运行MySQL(cmd不能运行mysql)
- 基于163镜像站的MySQL数据库管理(163镜像站mysql)
- MySQL一年之路回顾一年中的发展与变化(mysql 一年)
- MySQL 不可重复读案例实测找不同游戏的坑点(mysql不可重复读案例)
- 如何使用MySQL在万网上传文件(mysql上传万网)
- 推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)