博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP开发入门1
阅读量:6690 次
发布时间:2019-06-25

本文共 2599 字,大约阅读时间需要 8 分钟。

hot3.png

  1.    

     一直都想学习PHP扩展开发。每当看到那么多的C代码就会觉得无从下手。有一次也用也开发了一个hello world。但是还是不甚理解。

    最近,需要一个生成随机字符串的方法。觉得原生PHP生成的有些慢(主要是想试试是否可以学会写扩展)。于是乎就用zehphir写了一个扩展。

    阿西吧。速度比原生的还慢。之前也测试过zephir,这个貌似不加载PHP原生函数的时候还可以,一旦调用原生函数,速度就会一降再降。所以想学zephir的,还是把他当作一种代码加密方式。

    于是,还是考虑用C吧。那么怎么开发呢?

    百度,谷歌等搜索出来一大堆教程。有很多都说让先写个def文件。这个我第一次做的时候就是用的这种方法。不过这次死活没有找到def的编写教程。于是找教程。

    最终,我发现写扩展,主要就需要在几个地方添加定义,或添加功能即可。当然这里只是做个简单的函数而已。如何开发类,现在还没有看到,有资料的朋友可以提供一些。

     首先,ext_skel生成扩展代码。

./ext_skel --extname=phpext

      然后,进入phpext目录,可以看到php_phpext.h和phpext.c。接下来首先打开php_phpext.h,找到如下代码

PHP_MINFO_FUNCTION(phpext);

在下面添加你想添加的函数,其中函数名称需要自定义一个英文字符串

PHP_FUNCTION(函数名称)

  接下来打开phpext.c,找到如下代码。这里是PHP入口函数,需要告诉PHP你都有哪些函数。

const zend_function_entry ukey_functions[] = {}

   在其中输入你刚才添加的PHP函数名称

 PHP_FE(函数名称, NULL)

   下面就要放大招了。添加函数的功能。在phpext.c的最后添加功能

PHP_FUNCTION(函数名称){//这里填写功能if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) //这里获取一个整形的  参数 。length需要前面定义,这里获取到的参数赋值给length{    RETURN_NULL();//返回null  }}

 

PHP 内置的返回函数

#define RETVAL_RESOURCE(l)				ZVAL_RESOURCE(return_value, l)#define RETVAL_BOOL(b)					ZVAL_BOOL(return_value, b)#define RETVAL_NULL() 					ZVAL_NULL(return_value)#define RETVAL_LONG(l) 					ZVAL_LONG(return_value, l)#define RETVAL_DOUBLE(d) 				ZVAL_DOUBLE(return_value, d)#define RETVAL_STRING(s, duplicate) 		ZVAL_STRING(return_value, s, duplicate)#define RETVAL_STRINGL(s, l, duplicate) 	ZVAL_STRINGL(return_value, s, l, duplicate)#define RETVAL_EMPTY_STRING() 			ZVAL_EMPTY_STRING(return_value)#define RETVAL_ZVAL(zv, copy, dtor)		ZVAL_ZVAL(return_value, zv, copy, dtor)#define RETVAL_FALSE  					ZVAL_BOOL(return_value, 0)#define RETVAL_TRUE   					ZVAL_BOOL(return_value, 1)#define RETURN_RESOURCE(l) 				{ RETVAL_RESOURCE(l); return; }#define RETURN_BOOL(b) 					{ RETVAL_BOOL(b); return; }#define RETURN_NULL() 					{ RETVAL_NULL(); return;}#define RETURN_LONG(l) 					{ RETVAL_LONG(l); return; }#define RETURN_DOUBLE(d) 				{ RETVAL_DOUBLE(d); return; }#define RETURN_STRING(s, duplicate) 	{ RETVAL_STRING(s, duplicate); return; }#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }#define RETURN_EMPTY_STRING() 			{ RETVAL_EMPTY_STRING(); return; }#define RETURN_ZVAL(zv, copy, dtor)		{ RETVAL_ZVAL(zv, copy, dtor); return; }#define RETURN_FALSE  					{ RETVAL_FALSE; return; }#define RETURN_TRUE   					{ RETVAL_TRUE; return; }

PHP  接收并格式化参数

b	Booleanl	Integer 整型d	Floating point 浮点型s	String 字符串r	Resource 资源a	Array 数组o	Object instance 对象O	Object instance of a specified type 特定类型的对象z	Non-specific zval 任意类型~Z	zval**类型f	表示函数、方法名称,PHP5.1里貌似木有... .

 

转载于:https://my.oschina.net/xavier007/blog/672410

你可能感兴趣的文章
报警系统QuickAlarm之报警规则的设定与加载
查看>>
【CLI】使用 Curl 下载文件实时进度条显示
查看>>
Android 滤镜效果和颜色通道过滤
查看>>
Ruby开发者已可通过Fog管理Microsoft Azure服务
查看>>
Chrome和HTTPS:安全Web的征途
查看>>
软件专家的对话模式(第一部分)
查看>>
脚本填报表的条件查询
查看>>
从一个开发的角度看负载均衡和LVS
查看>>
Spring Boot(12)——使用MongoDB
查看>>
c++基础(上) 听课流水账
查看>>
Observable
查看>>
k8s使用deployment升级
查看>>
ionic3项目实战教程 - 第10讲 ionic3分类菜单设计(类似外卖)
查看>>
深度解析 | K8S API Server之入门须知
查看>>
LeanEngine 中使用 WebSocket
查看>>
浅入分析和Linux内核相关的文件夹/proc和/sys .
查看>>
Java 二分查找
查看>>
刚刚,阿里开源了一项重磅炸弹,终结程序员“中年危机”!
查看>>
《Spring Boot开发:从0到1》图片
查看>>
教你十分钟构建好 SpringBoot + SSM 框架
查看>>