很多站长朋友们都不太清楚PHP注册的函数,今天小编就来给大家整理PHP注册的函数,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 在PHP中如何正确创建函数 2、 该学习哪些PHP函数?PHP常用函数 3、 如何使用php实现openfire用户同步添加,删除,修改 4、 PHP流(Stream)的概述与使用详解 在PHP中如何正确创建函数Step 1 =>
php的扩展模块都放在 ext/ 目录下,比如说 snmp模块、mysql模块。 我们要建立自己的模块,就要在ext目录下为自己的模块建一个目录。比如,我们要做一个分析config文件的模块,命名为pconfig模块(parse config的简写),需在ext下建立目录pconfig。将我写好的7个文件copy到该目录下,另外需对主目录下的configure和internal_functions.c作一些修改。
Step 2 =>
Makefile.am Makefile.in
是模板文件,用户执行configure时,会调用这两个文件,生成编译时所用的Makefile文件。修改时将小写的pconfig换成你自己的模块名,别忘了把大写的PCONFIG也替换掉(不要告诉我你不会vi的替换语句)。config.m4也是执行configure将会调用的检测脚本程序,以后我们来讨论这些脚本程序的更深入的修改。现在你只需要把pconfig该成你的模块就可以了。对config.h.stub和setup.stub也如法炮制。其实setup.stub也没什么用。
Step 3 =>
php3-pconfig.h 头文件中
extern php3_module_entry pconfig_module_entry;
#define pconfig_module_ptr pconfig_module_entry
#define phpext_pconfig_ptr pconfig_module_ptr
这几行定义了模块的入口,将入口注册到php后,php会通过模块入口找到你写的函数
下面几个函数定义是用宏进行定义的,展开以后其实就是 php3_minit_pconfig , php3_rinit_pconfig ……分别在你的模块初试化或结束时被调用,如果你的模块很简单,也就不需要这些定义了
extern PHP_MINIT_FUNCTION(pconfig);
extern PHP_RINIT_FUNCTION(pconfig);
extern PHP_MSHUTDOWN_FUNCTION(pconfig);
PHP_MINFO_FUNCTION(pconfig);
这是你的函数声明,将来写在php脚本语句中的函数名就是在PHP_FUNCTION中定义的名字。
PHP_FUNCTION(pconfig_test);
如果有多个,还可以继续往下加
PHP_FUNCTION(pconfig_parsefile);
PHP_FUNCTION(pconfig_release); …….
Step 4 =>
接下来我们看最重点的C代码了
function_entry pconfig_functions[] = {
PHP_FE(pconfig_test, NULL)
{NULL, NULL, NULL}
};
定义的是你的函数的入口(前面我们提到过模块的入口),按照格式将你在头文件中定义的函数写进去吧。注意,这是用宏定义的,不要管语法是否正确。以后我们具体讨论这些宏的用法。
php3_module_entry pconfig_module_entry = {
"pconfig", pconfig_functions, PHP_MINIT(pconfig), PHP_MSHUTDOWN(pconfig), PHP_RINIT(pconfig), NULL, PHP_MINFO(pconfig), STANDARD_MODULE_PROPERTIES
};
注册模块的入口信息,比如模块名,函数接口,初试化模块将调用的函数等等,如果你的模块不执行复杂操作的话,可以忽略掉他们,写成
php3_module_entry pconfig_module_entry = {
"pconfig", pconfig_functions, NULL,NULL,NULL,NULL,NULL,STANDARD_MODULE_PROPERTIES
};
Step 5 =>
写你自己的函数
在头文件和function_entry处,我们已经定义了自己的函数pconfig_test,现在我们就来实现pconfig_test的功能。就比如执行两个数相加的和吧。
static void _php3_pconfig_test(INTERNAL_FUNCTION_PARAMETERS)
{ ......
}
PHP_FUNCTION(pconfig_test)
{
_php3_pconfig_test(INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
当系统调用pconfig_test时,会调用你的_php3_pconfig_test函数,当然你也可以把_php3_pconfig_test里的内容直接写在PHP_FUNCTION(pconfig_test)中,这样做只是程序结构比较清晰。注意:不要将_php3_pconfig_test命名成php3_pconfig_test,PHP_FUNCTION(pconfig_test)宏展开后实际上就是php3_pconfig_test!
Step 6 =>
好了,现在我们开始修改configure,在echo $ac_n "checking for MySQL support""... $ac_c" 1>6的前面(当然,如果你熟悉configure的话,可以加在任何合适的地方)加上下面几句话
if test "${with_pconfig+set}" = set; then
withval="$with_pconfig"
# Add your lib in here
EXTRA_LIBS="$EXTRA_LIBS"
# Add your include path in here
INCLUDES="$INCLUDES"
EXT_SUBDIRS="$EXT_SUBDIRS pconfig"
EXT_LIBS="$EXT_LIBS pconfig/libphpext_pconfig.a"
EXTINFO_DEPS="$EXTINFO_DEPS ext/pconfig/extinfo.c.stub"
EXT_STATIC="$EXT_STATIC pconfig"
fi
修改internal_functions.c,在头文件定义中加入#include "ext/pconfig/php3_pconfig.h"
在zend_module_entry数组中加入phpext_pconfig_ptr,
Step 7 =>
从新configure,带上需要的参数,不要忘记的是在参数里加入 --with-pconfig
Step 8 =>
index.php3
<? echo pconfig_test(123,678)."
"; ?>
执行%>php index.php3
810
该学习哪些PHP函数?PHP常用函数以下是记php的常用函数,网上转载的:
php
//===============================时间日期===============================
//y返回年最后两位,Y年四位数,m月份数字,M月份英文。d月份几号数字,D星期几英文
$date=date("Y-m-d");
$date=date("Y-m-d H:i:s");//带时分秒
//include,include_once.require,require_once
//require("file.php") 在PHP程序执行前就会先读入require所指定引进的文件,如出现错误是致命的。
//include("file.php") 可以放在PHP程序的任何位置,PHP程序执行到时才读入include指定引入的文件,如出现错误会提示
//===============================输出打印===============================
//sprintf("%d","3.2") ;//只格式化,返回格式化后的字符串,不输出。
//printf("%d","3.2") ;//即格式化,又输出
//print("3.2") ;//只输出
//echo "nihao","aa";//可以输出多个字符串
//print_r(array("a","b","c"));//将数组的键值与元素依次显示
//===============================常用字符串函数===============================
//获取字符串长度,有多少个字符,空格也算
$str=" sdaf sd ";
$len=strlen($str);
//用第一个参数里的字符串,把后面数组里的每个元素连接起来,返回一个字符串。
$str=implode("-",array("a","b","c"));
//字符串分割方法,返回一个数组,用第一个参数里的字符分割后面的字符串,指定字符的前后和之间都截取,如果指定字符在开头或结尾则返回的数组开头或结尾的元素为空字符串
//没有分割到字符串就返回给数组对应元素一个空值。最后一个限制返回数组长度,可不限制,则一直分割下去。
$array=explode("a","asddad addsadassd dasdadfsdfasdaaa",4);
//print_r($array);
//剔除字符串左边开头的空格,并返回
//如有第二个参数则是剔除左边开头的空格换成剔除第二个参数里的字符串
$str=ltrim("a asd ","a");
//剔除字符串右边开头的空格
$str=rtrim(" asd ");
//把第一个字符串两边以第二个参数开头的字符串剔除。如没有第二个参数,默认剔除掉字符串两边开头的空格
$str=trim(" sdsdfas ","a");
//从字符串第一个参数里的指定位置开始取多长(多少个)字符,字符串中第一个字符位置从0算。
//如果第二个参数为负则从字符串结尾倒数第几个开始取多长的字符串。结尾最后一个字符算-1,截取方向总是从左到右
$str=substr("abcdefgh",0,4);
//将第三个参数的第一个参数字符串用参数二字符串替换
$str=str_replace("a","","abcabcAbca");
//与str_replace用法同,只是不区分大小写
//$str=str_ireplace("a"," ","abcabcAbca");
//返回括号里字符串的字符全部大写的字符串
$str=strtoupper("sdaf");
//将括号里第一个字符串变成大写后返回
$str=ucfirst("asdf");
//用echo等将括号里字符串打印在网页上时原汁原味打印出括号里的字符串,包括标签字符
$str=htmlentities("
");
//返回第二个参数字符串在第一个字符串里出现的次数
$int=substr_count("abcdeabcdeablkabd","ab");
//返回第二个字符串在第一个字符串第一次出现的位置,第一个字符位置算0
$int=strpos("asagaab","ab");
//返回第二个字符串在第一个字符串最后一次出现的位置,第一个字符位置算0
$int=strrpos("asagaabadfab","ab");
//截取返回参数一中从左至右第一个出现的参数二到参数一最后一个字符的字符串
$str=strstr("sdafsdgaababdsfgs","ab");
//截取返回参数一中从左至右最后一个出现的参数二到参数一最后一个字符的字符串
$str=strrchr("sdafsdgaababdsfgs","ab");
//将参数二中每一个字符在参数一中相同字符前加"\"
$str=addcslashes("abcdefghijklmn","akd");
//将参数一的字符串填充到参数二指定的长度(单字符个数),参数三为指定填充的字符串,不写默认空格
//参数四填充位置,0在参数一左侧开头填充,1右侧开头,2两边开头同时。不写默认在右侧开头填充
$str=str_pad("abcdefgh",10,"at",0);
//依次比较两字符串对应字符阿斯克码值,第一对不一样的,如果参数一里大于参数二里的返回1,反之返回-1,两字符串完全一样返回0
$int1=strcmp("b","a");
//返回第一个参数格式化后的数字格式,第二个参数为保留几个小数,参数三为将小数点换成参数三,参数四为整数部分每三位用什么字符分割
//后面三个参数都不写,则默认去掉小数部分,整数每隔三位用逗号,分割。参数三,参数四必须同时存在
$str=number_format(1231233.1415,2,"d","a");
//===============================常用数组方法===============================
$arr=array("k0"=>"a","k1"=>"b","k2"=>"c");
//返回数组元素个数
$int=count($arr);
//判断第二参数的数组元素中是否有第一个参数元素
$bool=in_array("b",$arr);
//返回括号中数组所有键值组成的新数组原数组不改变
$array=array_keys($arr);
//判断第二个参数的数组中是否有第一个参数的键值,返回真假
$bool=array_key_exists("k1",$arr);
//返回原数组中所有元素值组成的新数组,键值从0开始自增,原数组不变
$array=array_values($arr);
//返回当前数组指针指向的键值
$key=key($arr);
//返回当前数组指针指向的元素值
$value=current($arr);
//返回当前数组指针指向元素的键值及元素值组成的数组,再将指针推向下一位,最后指针指向的是一个空元素返回空
//返回的数组中有四个固定键值对应的元素值分别是返回元素的键值及元素值,其中0,'key'键值都对应返回元素键值,1,'value'键值都对应返回的元素值
$array=each($arr);
//先将数组指针推向下一位,再返回指针移动后指向的元素值
$value=next($arr);
//将数组指针推向上一位,再返回指针移动后指向的元素值
$value=prev($arr);
//让数组指针重置指向第一个元素并返回元素值
$value=reset($arr);
//将数组指针指向最后一位元素,并返回最后一位元素值
$value=end($arr);
//将第一个参数以后的参数作为元素追加入第一个参数数组的末尾,索引从最小的没用过的数值开始计,返回之后的数组长度
$int=array_push($arr,"d","dfsd");
//将第一个参数数组后面所有参数作为元素添加到第一个参数数组开头处,键值以0从第一个元素处重新累加,原非数值的键值保持不变,原元素排序位置不变,返回之后的数组长度
$int=array_unshift($arr,"t1","t2");
//返回从数组尾部提取最后一个元素值,并把最后一个元素从原数组中剔除
$value=array_pop($arr);
//array_pop相反,提取返回数组头一个元素值,并把头一个元素从原数组中剔除
$value=array_shift($arr);
//让第一个参数数组达到第二个参数数值长度,将第三个参数作为元素添加到第一个参数数组的末尾,索引从最小没用过数值开始计并返回,原数组不改变
$array1=array_pad($arr,10,"t10");
//返回一个将原数组中多余重复元素剔除掉的新数组,原数组不改变
$array=array_unique($array1);
//将原数组键值打破重新以元素值的阿斯克码值从小到大排序,索引从数字0开始重计
$int=sort($array);
//和sort相反,以元素值阿斯柯码值大小降序重新排序,索引从0重新计
$int=rsort($array);
//返回将第一个参数数组中每一个元素值依次作为键值付给参数二数组的数组,两数组长度必须一致,原数组不改变
$array=array_combine(array("a","b","c","d","e"),$arr);
//将两个数组合并并返回原数组不变
$array=array_merge($arr,array("a","b","c"));
//在第一个参数数组中从第二个参数数值位置开始截取到第三个参数数值长度的数组键值+元素并返回,数组第一个元素位置从0计
$array=array_slice($arr,2,1);
//截取功能和array_slice()一样,只是将截取部分在原数组中剔除
$array=array_splice($arr,2,1);
//将第一个参数作为第一个元素,每次自增参数三的值,自增后再作为一个元素存在数组中,直到值达到参数二的值存到数组中为止并返回这个数组
//参数一,参数二可以是数字,可以是单个字符,单字符就按阿斯柯码值算,第三个参数不写默认每次自增1
$array=range(3,9,2);
//将原数组元素与对应键值的对应关系重新随机排列返回真假
$bool=shuffle($arr);
//计算数组中所有数值型元素值的和
$int=array_sum(array("a",2,"cssf"));
//把一个数组分割为新的数组块,新数组每个元素都是一个数组,新数组每个元素内有几个元素由参数二决定
//第三个参数决定元素的键值是否保留原键值可不写,true为保留,默认false不保留
$array=array_chunk(array("a"=>"a","b","c","d","e","f","g","h"),2,true);
//json_encode()将数组转换成JSON格式字符串返回
$arr = array('k1'=>'val1','k2'=>'val2','k3'=>array('v3','v4'));
echo $encode_str = json_encode($arr);
//json_decode()将JSON格式字符串转换成能强制转换成数组的对象返回,JSON格式字符串中键与值需要引号括起来时必须用双引号
$decode_arr = (array)json_decode($encode_str);
var_dump($decode_arr);
?>
如何使用php实现openfire用户同步添加,删除,修改下载一个插件UserService。
这个插件的作用就是允许程序设计师通过http管理openfire的用户。
部署以后默认userservice是没有开启的,你需要到后台开启并且设置验证码,为了确保安全你也许还要设置一个安全的ip~~
服务器部署完成
下面看看如何使用程序调用。
以注册用户为例,以下是我写的一个注册函数
PHP代码
functionregIMFunction($userid,$plainpwd,$uname,$email)
{
$f = fopen('http //im blogguy cn:9090/plugins/userService/userservice?type=addsecret=J7yusername=$useridpassword=$plainpwdname=$unameemail=$email','r');
$response = fread($f, 1024);
if(ereg('OK',$response)) {
returntrue;
}else{
returnfalse;
}
fclose($f);
}
这样可以实现同步注册。
PHP流(Stream)的概述与使用详解在现代 PHP 特性中,流或许是最出色但使用率最低的。虽然 PHP 4.3 就引入了流,但是很多开发者并不知道流的存在,因为人们很少提及流,而且流的文档也很匮乏。PHP 官方文档对流的解释如下:
可能看完这段解释后还是云里雾里,我们简化一下,流的作用是在出发地和目的地之间传输数据。出发地和目的地可以是文件、命令行进程、网络连接、ZIP 或 TAR 压缩文件、临时内存、标准输入或输出,或者是通过 PHP 流封装协议实现的任何其他资源。
如果你读写过文件,就用过流;如果你从 php://stdin 读取过数据,或者把输入写入 php://stdout ,也用过流。流为 PHP 的很多 IO 函数提供了底层实现,如 file_get_contents、fopn、fread 和 fwrite 等。PHP 的流函数提供了不同资源的统一接口。
我们可以把流比作管道,把水(资源数据)从一个地方引到另一个地方。在水从出发地到目的地的过程中,我们可以过滤水,可以改变水质,可以添加水,也可以排出水。
流式数据的种类各异,每种类型需要独特的协议,以便读写数据,我们称这些协议为 流封装协议 。例如,我们可以读写文件系统,可以通过 HTTP、HTTPS 或 SSH 与远程 Web 服务器通信,还可以打开并读写 ZIP、RAR 或 PHAR 压缩文件。这些通信方式都包含下述相同的过程:
1.开始通信
2.读取数据
3.写入数据
4.结束通信
虽然过程是一样的,但是读写文件系统中文件的方式与收发 HTTP 消息的方式有所不同,流封装协议的作用是使用通用的接口封装这种差异。
每个流都有一个协议和一个目标。指定协议和目标的方法是使用流标识符:<scheme>://<target>,其中 <scheme> 是流的封装协议,<target> 是流的数据源。
http://流封装协议
下面使用 HTTP 流封装协议创建了一个与 Flicker API 通信的 PHP 流:
不要以为这是普通的网页 URL,file_get_contents() 函数的字符串参数其实是一个流标识符。http 协议会让 PHP 使用 HTTP 流封装协议,在这个参数中,http 之后是流的目标。
我们通常使用 file_get_contents()、fopen()、fwrite() 和 fclose() 等函数读写文件系统,因为 PHP 默认使用的流封装协议是 file://,所以我们很少认为这些函数使用的是 PHP 流。下面的示例演示了使用 file:// 流封装协议创建一个读写 /etc/hosts 文件的流:
我们通常会省略掉 file:// 协议,因为这是 PHP 使用的默认值。
php://流封装协议
编写命令行脚本的 PHP 开发者会感激 php:// 流封装协议,这个流封装协议的作用是与 PHP 脚本的标准输入、标准输出和标准错误文件描述符通信。我们可以使用 PHP 提供的文件系统函数打开、读取或写入下面四个流:
1. php://stdin :这是个只读 PHP 流,其中的数据来自标准输入。PHP 脚本可以使用这个流接收命令行传入脚本的信息;
2. php://stdout :把数据写入当前的输出缓冲区,这个流只能写,无法读或寻址;
3. php://memory :从系统内存中读取数据,或者把数据写入系统内存。缺点是系统内存有限,所有使用 php://temp 更安全;
4. php://temp :和 php://memory 类似,不过,没有可用内存时,PHP 会把数据写入这个临时文件。
其他流封装协议
PHP 和 PHP 扩展还提供了很多其他流封装协议,例如,与 ZIP 和 TAR 压缩文件、FTP 服务器、数据压缩库、Amazon API、Dropbox API 等通信的流封装协议。需要注意的是,PHP 中的 fopen()、fgets()、fputs()、feof() 以及 fclose() 等函数不仅可以用来处理文件系统中的文件,还可以在所有支持这些函数的流封装协议中使用。
自定义流封装协议
我们还可以自己编写 PHP 流封装协议。PHP 提供了一个示例 StreamWrapper 类,演示如何编写自定义的流封装协议,支持部分或全部 PHP 文件系统函数。关于如何编写,具体请参考以下文档:
有些 PHP 流能够接受一系列可选的参数,这些参数叫流上下文,用于定制流的行为。不同的流封装协议使用的流上下文有所不同,流上下文使用 stream_context_create() 函数创建,这个函数返回的上下文对象可以传入大多数文件系统函数。
例如,你知道可以使用 file_get_contents() 发送 HTTP POST 请求吗?使用一个流上下文对象即可实现:
流过滤器
目前为止我们讨论了如何打开流,读取流中的数据,以及把数据写入流。不过,PHP 流真正强大的地方在于过滤、转换、添加或删除流中传输的数据,例如,我们可以打开一个流处理 Markdown 文件,在把文件内容读入内存的过程中自动将其转化为 HTML。
运行该脚本,输出的都是大写字母:
我们还可以使用 php://filter 流封装协议把过滤器附加到流上,不过,使用这种方式之前必须先打开 PHP 流:
这个方式实现效果和 stream_filter_append() 函数一样,但是相比之下更为繁琐。不过,PHP 的某些文件系统函数在调用后无法附加过滤器,例如 file() 和 fpassthru(),使用这些函数时只能使用 php://filter 流封装协议附加流过滤器。
自定义流过滤器
我们还可以编写自定义的流过滤器。其实,大多数情况下都要使用自定义的流过滤器,自定义的流过滤器是个 PHP 类,继承内置的 php_user_filter 类( ),且必须实现 filter()、onCreate() 和 onClose() 方法,最后,必须使用 stream_filter_register() 函数注册自定义的流过滤器。
然后,我们必须使用 stream_filter_register() 函数注册这个自定义的 DirtyWordsFilter 流过滤器:
第一个参数用于标识这个自定义过滤器的过滤器名,第二个参数是这个自定义过滤器的类名。接下来就可以使用这个自定义的流过滤器了:
修改 test.txt 内容如下:
运行上面的自定义过滤器脚本,结果如下:
stream_bucket_append函数:为队列添加数据
stream_bucket_make_writeable函数:从操作的队列中返回一个数据对象
stream_bucket_new函数:为当前队列创建一个新的数据
stream_bucket_prepend函数:预备数据到队列
stream_context_create函数:创建数据流上下文
stream_context_get_default函数:获取默认的数据流上下文
stream_context_get_options函数:获取数据流的设置
stream_context_set_option函数:对数据流、数据包或者上下文进行设置
stream_context_set_params函数:为数据流、数据包或者上下文设置参数
stream_copy_to_stream函数:在数据流之间进行复制操作
stream_filter_append函数:为数据流添加过滤器
stream_filter_prepend函数:为数据流预备添加过滤器
stream_filter_register函数:注册一个数据流的过滤器并作为PHP类执行
stream_filter_remove函数:从一个数据流中移除过滤器
stream_get_contents函数:读取数据流中的剩余数据到字符串
stream_get_filters函数:返回已经注册的数据流过滤器列表
stream_get_line函数:按照给定的定界符从数据流资源中获取行
stream_get_meta_data函数:从封装协议文件指针中获取报头/元数据
stream_get_transports函数:返回注册的Socket传输列表
stream_get_wrappers函数:返回注册的数据流列表
stream_register_wrapper函数:注册一个用PHP类实现的URL封装协议
stream_select函数:接收数据流数组并等待它们状态的改变
stream_set_blocking函数:将一个数据流设置为堵塞或者非堵塞状态
stream_set_timeout函数:对数据流进行超时设置
stream_set_write_buffer函数:为数据流设置缓冲区
stream_socket_accept函数:接受由函数stream_ socket_server()创建的Socket连接
stream_socket_client函数:打开网络或者UNIX主机的Socket连接
stream_socket_enable_crypto函数:为一个已经连接的Socket打开或者关闭数据加密
stream_socket_get_name函数:获取本地或者网络Socket的名称
stream_socket_pair函数:创建两个无区别的Socket数据流连接
stream_socket_recvfrom函数:从Socket获取数据,不管其连接与否
stream_socket_sendto函数:向Socket发送数据,不管其连接与否
stream_socket_server函数:创建一个网络或者UNIX Socket服务端
stream_wrapper_restore函数:恢复一个事先注销的数据包
stream_wrapper_unregister函数:注销一个URL地址包
整合资料
本文整合于以下两篇文章
关于PHP注册的函数的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。