PHP开发入门1

  1. PHP开发入门1

  2. PHP开发入门2---->PHP扩展开发入门2 HELLO WORLD

  3. PHP扩展开发入门3------>带参数的函数

一直都想学习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你都有哪些函数。

1const zend_function_entry ukey_functions[] = { 2 3 4}

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

 PHP_FE(函数名称, NULL)

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

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

PHP 内置的返回函数

1#define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l) 2#define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b) 3#define RETVAL_NULL()  ZVAL_NULL(return_value) 4#define RETVAL_LONG(l)  ZVAL_LONG(return_value, l) 5#define RETVAL_DOUBLE(d)  ZVAL_DOUBLE(return_value, d) 6#define RETVAL_STRING(s, duplicate)  ZVAL_STRING(return_value, s, duplicate) 7#define RETVAL_STRINGL(s, l, duplicate)  ZVAL_STRINGL(return_value, s, l, duplicate) 8#define RETVAL_EMPTY_STRING()  ZVAL_EMPTY_STRING(return_value) 9#define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor) 10#define RETVAL_FALSE   ZVAL_BOOL(return_value, 0) 11#define RETVAL_TRUE    ZVAL_BOOL(return_value, 1) 12 13#define RETURN_RESOURCE(l)  { RETVAL_RESOURCE(l); return; } 14#define RETURN_BOOL(b)  { RETVAL_BOOL(b); return; } 15#define RETURN_NULL()  { RETVAL_NULL(); return;} 16#define RETURN_LONG(l)  { RETVAL_LONG(l); return; } 17#define RETURN_DOUBLE(d)  { RETVAL_DOUBLE(d); return; } 18#define RETURN_STRING(s, duplicate)  { RETVAL_STRING(s, duplicate); return; } 19#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; } 20#define RETURN_EMPTY_STRING()  { RETVAL_EMPTY_STRING(); return; } 21#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; } 22#define RETURN_FALSE   { RETVAL_FALSE; return; } 23#define RETURN_TRUE    { RETVAL_TRUE; return; }

PHP  接收并格式化参数

1b Boolean 2l Integer 整型 3d Floating point 浮点型 4s String 字符串 5r Resource 资源 6a Array 数组 7o Object instance 对象 8O Object instance of a specified type 特定类型的对象 9z Non-specific zval 任意类型~ 10Z zval**类型 11f 表示函数、方法名称,PHP5.1里貌似木有... .
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap