怎么样“抄“一个PHP扩展来维持生活?

2023-10-2409:01:22后端程序开发Comments1,083 views字数 1409阅读模式

写一个WEB服务器,如果用file_get_contents从磁盘中读取文件,并发直线下降,用sendfile可以提升性能。但是,PHP不支持,开发扩展我又不会,只能靠抄袭PHP扩展源码维持一下生活这样子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

看一下sendfile的原型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

这个函数在linux2.6.3之前的内核,out_fd只能是socket类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

我们要实现的sendfile的PHP函数原型也差不多,为了简单,我就不要offset这个参数了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

而且,规定out_fd必须是stream类型的资源,in_fd必须是普通文件类型的资源:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

生成开发骨架,怎么办?不会,Google一下,好像运行个命令就可以了:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

我用的php7.3版本,好像无需手动去注释,也好,省事。按照网上的教程,不管三七二十一,先复制一份PHP_FUNCTION(sendfile)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

接下来咋办?我又不会,只能看看别人怎么搞的,到ext里面找找,好像都得先接收传过来的变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

连猜带蒙(人家的宏名字取得多好,跟读英文似的),这一堆宏应该就是用来接收变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

你看看PARSE_PARAMETERS_START直译过来就是开始解析参数, 至于它的两个参数,你去这个宏定义的地方看看文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

完美的命名,这个宏要求的最小参数个数和最大参数个数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

这个很容易就联想到,最小参数个数不就是必填参数个数么?最大参数个数不就是必填+选填个数总数么?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

PARAM_RESOURCE直译过来就是资源类型的参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

PARAM_LONG直译过来就是整型参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

PARAM_OPTIONAL直译过来就是可选的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

PARSE_PARAMETERS_END直译过来就是结束解析参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

至于前面的ZEND和Z,你还不允许人家加个前缀,表示这宏是人家命名的呀?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

根据我们之前的分析,前两个用zval接,count用zend_long接。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

接下来怎么玩?我们不是要调用sendfile吗?不管三七二十一,先把C语言的sendfile函数调用写上去,如果成功就返回写入的长度,失败就返回false.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

然后呢?想办法把zval类型变成int类型的fd,怎么变呢,我又不会,只能继续发挥拿来主义精神,去ext找找看人家是怎么玩的。终于,在ext/sockets/sockets.c的文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

PHP_FUNCTION(socket_import_stream)中找到把zval转成int类型的方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

OK,开抄。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

1、先把zval转成php_stream,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

2、再把php_streamphp_stream_cast转成STDIO。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

3、再调用fileno把stream资源转成int类型的文件描述符。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

这几个函数都不用我解释,人家的命名太完美了,php_stream_is判断php_stream是不是指定类型的流。php_stream_cast流转换函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

好激动,是不是快成功了?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

接下来怎么玩?我又不会了,还是去看看人家怎么玩的吧。好像要配置参数信息之类的,连猜带蒙。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

还要把函数加到函数实体结构体里面:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

收功,我们写完PHP的一个功能,往往会跑个单元测试,来验证这个功能是不是达到我们的预期。刚好看到我们的扩展根目录有个tests目录,没办法,我又不会,只能再去别的ext里面偷师。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

先新建一个request.txt,里面的内容是文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

注意一下http协议格式,后面的换行也是内容:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

哇,应该快好了吧?好激动,赶紧编译四步曲:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

好开心,居然没问题!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

怎么样“抄“一个PHP扩展来维持生活?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

成功运用到自己玩的项目中,抄袭完成。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html

作者:church
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/56503.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/56503.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定