位置: 编程技术 - 正文

PHP流Streams、包装器wrapper概念与用法实例详解(php文件流)

编辑:rootadmin

推荐整理分享PHP流Streams、包装器wrapper概念与用法实例详解(php文件流),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php字节流,php stream_select,php stream_select,php stream_select,php流程,php stream_select,php stream_select,php io流,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了PHP流Streams、包装器wrapper概念与用法。分享给大家供大家参考,具体如下:

流Streams这个概念是在php4.3引进的,是对流式数据的抽象,用于统一数据操作,比如文件数据、网络数据、压缩数据等,以使可以共享同一套函数,php的文件系统函数就是这样的共享,比如file_get_contents()函数即可打开本地文件也可以访问url就是这一体现。简单点讲,流就是表现出流式数据行为的资源对象。

以线性方式进行读写,并可以在流里面任意位置进行搜索。

流有点类似数据库抽象层,在数据库抽象层方面,不管使用何种数据库,在抽象层之上都使用相同的方式操作数据,而流是对数据的抽象,它不管是本地文件还是远程文件还是压缩文件等等,只要来的是流式数据,那么操作方式就是一样的。

有了流这个概念就引申出了包装器wrapper这个概念,每个流都对应一种包装器,流是从统一操作这个角度产生的一个概念,而包装器呢是从理解流数据内容出发产生的一个概念,也就是这个统一的操作方式怎么操作或配置不同的内容;

这些内容都是以流的方式呈现,但内容规则是不一样的,比如http协议传来的数据是流的方式,但只有http包装器才理解http协议传来的数据的意思,可以这么理解,流就是一根流水的管子,只不过它流出的是数据,包装器就是套在流这根管子外层的一个解释者,它理解流出的数据的意思,并能操作它。

官方手册说:“一个包装器是告诉流怎么处理特殊协议或编码的附加代码”明白这句话的意思了吗?

包装器可以嵌套,一个流外面包裹了一个包装器后,还可以在外层继续包裹包装器,这个时候里层的包装器相对于外层的包装器充当流的角色在php自身底层实现的c语言开发文档有这样的解释:

流API操作一对不同级别:在基本级别,api定义了php_stream对象表示流式数据源,在稍微高一点的级别,api定义了php_stream_wrapper对象。

它包裹低一级别的php_stream对象,以提供取回URL的内容和元数据、添加上下文参数的能力,调整包装器行为;

每一种流打开后都可以应用任意数量的过滤器在上面,流数据会经过过滤器的处理,笔者认为过滤器这个词用得有点不准确,有些误导人。

PHP流Streams、包装器wrapper概念与用法实例详解(php文件流)

从字面意思看好像是去掉一些数据的感觉,应该称为数据调整器,因为它既可去掉一些数据,也可以添加,还可以修改,但历史原因约定俗成,也就称为过滤器了,大家心里明白就好。

我们经常看到下面的词,来解释下他们的区别:

资源和数据:资源是比较宏观的说法,通常包含数据,而数据是比较具象的说法,在开发程序的时候经常说是数据,而在软件规划时说是资源,他们是近义词,就像软件设计和程序开发的区别一样。

上下文和参数:上下文是比较宏观的说法,经常用在沟通上面,具体点讲就是一次沟通本身的参数,而参数这个说法往往用在比较具体的事情上面,比如说函数

上面解释了概念性的东西,下面来看看具体内容:

php支持的协议和包装器请看这里: 里面可以使用:做分割符,但php只允许://,所以url请使用" — 访问本地文件系统,在用文件系统函数时默认就使用该包装器 — 访问 HTTP(s) 网址 — 访问 FTP(s) — 访问各个输入/输出流(I/O streams) — 压缩流 — 数据(RFC ) — 查找匹配的文件路径模式 — PHP 归档ssh2:// — Secure Shell 2 — — 音频流 — 处理交互式的流

如何实现一个自定义的包装器:

在用fopen、fwrite、fread、fgets、feof、rewind、file_put_contents、file_get_contents等等文件系统函数操作流时,数据是先传给定义的包装器类对象,包装器再去操作流。如何实现一个自定义的流包装器呢?php提供了一个类原型,只是原型而已,不是接口也不是类,不能用于继承:

在这个原型里面定义的方法,根据自己需要去定义,并不要求全部实现,这就是为什么不定义成接口的原因,因为有些实现根本用不着某些方法,这带来很多灵活性,比如包装器是不支持删除目录rmdir功能的,那么就不需要实现streamWrapper::rmdir由于未实现它,如果用户在包装器上调用rmdir将有错误抛出,要自定义这个错误那么也可以实现它并在其内部抛出错误streamWrapper也不是一个预定义类,测试class_exists("streamWrapper")就知道,它只是一个指导开发者的原型

官方手册提供了一个例子: 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开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】 本文实例讲述了PHP开发之归档格式phar文件概念与用法。分享给大家供大家参考,具体如下:一个php应用程序往往是由多个文件构成的,如果能把他们集

php单元测试phpunit入门实例教程 本文实例讲述了php单元测试phpunit。分享给大家供大家参考,具体如下:这篇文章提供了一些phpunit官方教程没有提到的信息,帮助初学者快速了解php单元

使用PHPStorm+XDebug搭建单步调试环境 PHP是一个解释执行的语言,一般来说,进行调试的时候,只要通过使用var_dump或者var_export两个函数,就可以得到PHP中变量的值,达到调试的地步,但是

标签: php文件流

本文链接地址:https://www.jiuchutong.com/biancheng/275271.html 转载请保留说明!

上一篇:PHP实现求两个字符串最长公共子串的方法示例(php哪个函数能取得字符串长度)

下一篇:PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】

  • 个人所得税可以不交税吗
  • 视同销售增值税申报表怎么填写
  • 租厂房需要交租赁税吗
  • 金税盘清卡怎么统计税额
  • 成本核算的三种基本方法
  • 网吧电脑折旧率
  • 公司买金蝶计入什么科目
  • 私企捐助民办学校怎么办
  • 收到低值资产报废回收款账务处理
  • 银行卡酒店消费有记录吗
  • 财务费用过多有什么影响
  • 存货进口关税会计处理怎么做?
  • 河道工程修建维护管理费何时开始停征?
  • 增值税与实际缴纳不符
  • 税控盘证书密码一天可以输几次
  • 对公人民币转账、汇款(含退汇)分录
  • 软件服务类企业
  • 注册资本使用后账务如何处理
  • 境外个人汇入汇款规定
  • 主营业务收入增速怎么算
  • 分期付款的车怎么做分录
  • 公司投资私募股票有哪些
  • 消费税什么时候用最高售价
  • 工会经费的会计分录2022
  • 此电脑当前不满足运行win11是怎么回事
  • 高新企业研发费用占销售收入的比例
  • 汽车销售私下收客户红包
  • 实收资本可以大于注册资本吗
  • MacOS X Yosemite升级后postgresql启动报错的解决办法
  • win11资源管理器卡死
  • scrfs.exe - scrfs是什么进程 有什么用
  • 固定资产公允价值变动会计处理
  • 流转税的计税依据有哪些
  • 商品进销差价的作用
  • 企业所得税核定征收方法有哪两种
  • 小规模纳税人的企业所得税怎么算
  • framework怎么用
  • Node.js——http模块和导出共享
  • php fopen函数的用法
  • 固定资产清理属于非流动资产吗
  • python累加求和代码,直到最后一项小于10^-6
  • 已收到货款 还未发货的会计处理
  • 电子税务局税种核定在哪里
  • 项目资金支付
  • 所得税做账是否需要发票
  • 企业所得税的成本
  • 工资是什么?包括哪些
  • 事业单位资产负债表自动转帐
  • 季度亏损需要计提企业所得税吗
  • 奖励促销策略
  • 拆迁补偿怎么算的
  • 公司不营业需要交税吗
  • 营业外支出为负数原因
  • 没有销售收入月报怎么填
  • 资本金与注册资金的关系
  • 零配件供应是什么意思
  • mysql高级功能
  • sql server多表查询
  • win7 系统启动
  • ubuntu kylin 14.04下载 ubuntu优麒麟14.04 lts下载地址
  • windows取消定时任务
  • linux系统bug
  • winxp如何禁用u盘
  • QuickBooks - QuickBooks是什么进程 有什么用
  • win10安装win7主题
  • SCP 方便的Linux文件互传
  • linux 系统升级
  • WIN10安装教程
  • 2015.6.28开始写博客记录cocos2dx学习历程
  • 简述matlab中控制系统的数学描述类型
  • shell 去空格 trim
  • JavaScript基础语法详解
  • python中scipy.stats
  • 股权转让怎么计算个人所得税
  • 江西省发票查询系统
  • 税控盘怎么领用
  • 合格的税务人
  • 监察室主任岗位职责
  • 电子发票查询官方
  • 新疆税务电子
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设