位置: 编程技术 - 正文

PHP Wrapper在SAE上的应用方法(phpcrawl)

编辑:rootadmin

推荐整理分享PHP Wrapper在SAE上的应用方法(phpcrawl),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php swagger,phpwamp,php plates,php prepare(),php plates,php plates,php scrapy,php plates,内容如对您有帮助,希望把文章链接给更多的朋友!

本文讲述了PHP Wrapper在SAE上的应用方法。分享给大家供大家参考,具体如下:

一、PHP Wrapper是什么

自PHP 4.3开始,PHP开始允许用户通过stream_wrapper_register()自定义URL风格的协议。用户使用fopen(), copy()等文件系统函数对封装协议进行操作时,PHP会调用注册协议时所提供的类中相应的函数。PHP手册中给了一个例子,它将VariableStream类注册为 “ 读写 $GLOBALS['foo'] 。

二、SAE为什么需要PHP Wrapper

出于性能和安全方面的考虑,SAE平台上禁用了本地文件读写和对外的数据抓取。相应的,我们提供了对应的服务来做同样的事情。

由于新服务的接口和PHP本身的接口不太一样,专门为我们平台开发的程序当然不会存在问题,但是大量已有的程序和开源项目,就面临着繁杂的迁移工作。而使用PHP Wrapper对我们的服务的接口进行封装之后,用户就可以更方便地将程序迁移到SAE平台。

三、如何写PHP Wrapper

要通过PHP Wrapper封装一个协议,首先,我们需要写一个 streamWrapper 类,类名可自定义,类的格式为:

类中各方法说明:

streamWrapper::__construct — 构造函数,仅在stream_open前被调用streamWrapper::dir_closedir — 关闭目录句柄,响应closedir()函数streamWrapper::dir_opendir — 打开目录句柄,响应opendir()函数streamWrapper::dir_readdir — 从目录句柄读取条目,响应readdir()函数streamWrapper::dir_rewinddir — 倒回目录句柄,响应rewinddir()函数streamWrapper::mkdir — 创建目录,响应mkdir()函数streamWrapper::rename — 目录或文件重命名,响应rename()函数streamWrapper::rmdir — 删除目录,响应rmdir()函数streamWrapper::stream_cast — 检索基础资源,响应stream_select()函数streamWrapper::stream_close — 关闭资源,响应fclose()函数streamWrapper::stream_eof — 检查文件指针是否已经在文件末尾,响应feof()函数streamWrapper::stream_flush — 清除输出缓存,响应fflush()函数streamWrapper::stream_lock — 咨询文件锁定,响应flock()函数streamWrapper::stream_open — 打开文件或URL为流,响应fopen()函数streamWrapper::stream_read — 从流中读取内容,响应fread(), fgets()函数streamWrapper::stream_seek — 在流中定位指针,响应fseek()函数streamWrapper::stream_set_option — 改变流设置streamWrapper::stream_stat — 检索文件资源的信息,响应fstat()函数streamWrapper::stream_tell — 检索流中指针的位置,响应ftell()函数streamWrapper::stream_write — 向流中写入内容,响应fwrite(), fputs()函数streamWrapper::unlink — 删除文件,响应unlink()函数streamWrapper::url_stat — 检索文件的信息,响应所有stat()相关的函数,例如file_exists(), is_dir(), is_file(), filesize(), fileinode()等等

详细说明请参考PHP手册: stream_wrapper_register () 将这个类注册到Wrapper中,就可以开始使用了。函数使用方法为:

bool stream_wrapper_register ( string $protocol , string $classname [, int $flags = 0 ] )

例如:

由于SAE平台不支持对本地文件的写操作,因此Smarty之类的一些需要在本地写文件的开源项目就没办法直接在SAE平台上使用,而有了saemc Wrapper,用户就可以将Smarty编译的模板保存在MC中,很方便的将Smarty迁移到SAE平台上来。

在附件中我们为大家提供了SAE上Memcache Wrapper的实现代码,大家可以下载此附件进行测试。

在测试之前,需要先在本地启动一个端口为的Memcached服务:

然后使用下面代码就可以测试了:

测试页面的输出结果:

我们提供的 Memcache Wrapper并没有实现目录操作的一些方法和Memcache的Timeout,大家可以参考PHP手册,尝试实现目录操作,或者通过context使这个Wrapper支持Memcache的Timeout。

另外,大家可以到下面这个地址查看SAE Stdlib中sae_include的源码,在其中还有我们为Storage服务封装的saestor Wrapper和为Fetchurl服务重新封装的http Wrapper的实现:

构造函数

PHP Wrapper在SAE上的应用方法(phpcrawl)

streamWrapper 类很特别,它的构造函数并不是每次都调用的。只有在你的操作触发了stream_open相关的操作时才会调用,比如你用file_get_contents()了。而当你的操作触发和stream无关的函数时,比如file_exists会触发url_stat方法,这个时候构造函数是不会被调用的。

2. 读实现

Wrapper里边有Position和Seek等概念,但是很多服务其实是一次性就读取全部数据的,这个可以在stream_open的时候一次性读回,放到一个属性中,以后seek和tell的时候直接操作属性里边存放的数据就可以了。

3. 追加写实现

有很多服务是一次性写入所有数据,不支持追加写的功能(比如Memcache),这就需要我们自己在Wrapper中来实现追加写。可以将整个value一次性读取出来,将需要追加写的数据追加在读取出来的内容后面之后,再一次性写回。

但是这种追加写的实现方式性能会比较差,尤其是内容体积较大之后,一次性读取所有内容会非常消耗资源,因此在某些服务中我们不得不舍弃对追加写的支持。

4. url_stat的实现

在streamWrapper类的实现中,url_stat的实现是个难点。必须正确的实现url_stat才能使is_writable和is_readable等查询文件元信息的函数正常工作。

而我们需要为我们的虚设备伪造这些值。以mc为例,我们给大家一些参考数据:

url_stat应该返回一个数组,分个项,内容如下:

dev 设备号 - 写0即可;ino inode号 - 写0即可;mode 文件mode - 这个是文件的权限控制符号,稍后详细说明;nlink link - 写0即可;uid uid - Linux上用posix_get_uid可以取到,windows上为0;gid gid - Linux上用posix_get_gid可以取到,windows上为0;rdev 设备类型 - 当为inode设备时有值;size - 文件大小;atime - 最后读时间 格式为unix时间戳;mtime - 最后写时间;ctime - 创建时间;blksize - blocksize of filesystem IO 写零即可;blocks - number of -byte blocks allocated 写零即可;

其中mode的值必须写对:

如果是文件,其值为:

+ 文件权限,如 + 。

如果是目录,其值为:

+ 目录权限,如 + 。

5. 关于stat的缓存

PHP会在同一个页面的执行过程中对文件的元信息进行缓存。根据PHP文档对 clearstatcache() 这个方法的说明得知:在使用 stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), 或 fileperms() 方法查询文件信息时,PHP会将文件的stat的缓存以提高性能。 clearstatcache()方法可以用来清除这个缓存,当unlink()会自动清除stat缓存。

而实际上,PHP只有在对本地文件进行unlink, rename和rmdir操作时会清除stat缓存,而在通过其他的wrapper进行unlink, rename和rmdir操作时,并不会清除stat缓存。因此在写wrapper时我们要自己在unlink等方法中通过clearstatcache()来清除stat缓存。

点击此处下载附件。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php curl用法总结》、《php socket用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

微信公众平台DEMO(PHP) 本人在SAE环境下搭建了CI框架(其实这个小东西用不着用框架的),直接把代码写在了控制器里面phpif(!defined('BASEPATH'))exit('Nodirectscriptaccessallowed');//defineyourt

PHP 随机数 C扩展随机数 由于要用到固定长度的随机字符串。首先是一段PHP代码$str_md5=md5(uniqid());$rand=mt_rand(1,);$str1=substr($str_md5,$rand,6);$rand=mt_rand(1,);$str2=substr($str_md5,$rand,6);$ra

yii2超好用的日期组件和时间组件 日期组件,时间组件在平时开发中是必不可少的。今天我们就来谈谈在yii2中的超好用的时间组件,也省的大家各种找js插件了。分享之前我们先预览下

标签: phpcrawl

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

上一篇:PHP实现的限制IP投票程序IP来源分析(php限制接口调用次数)

下一篇:微信公众平台DEMO(PHP)(微信公众平台的名词解释)

  • 增值税发票认证在哪里
  • 不予认定一般纳税人
  • 税务迁移麻烦吗
  • 简易计税是什么税种
  • 一般纳税人适用会计制度怎么填
  • 出售固定资产不开票可以吗
  • 逐期增长量与累计增长量的关系是
  • 印花税不计入应交税科目吗?
  • 上级拨付的固定资产增加类型是什么
  • 实收资本转出怎么做账
  • 小规模餐饮业会计核算
  • 项目现金流量的构成
  • 某企业原材料采用实际成本核算,2019年6月
  • 哪些税不可以扣除
  • 外币收入怎么交税
  • 不同类型商业分布的特征
  • 母公司捐赠给子公司原材料怎么处理
  • 零税率发票如何抵扣
  • 退车辆保险费如何计算
  • 公司章程出资时间怎么填写
  • 筹建人员是什么工作
  • 期货手续费会计分录
  • 实收资本怎么用
  • 其他综合收益是什么意思
  • windows 11任务栏没有网络图标
  • 苹果推送ios15
  • 股权转让的不仅是权利还有义务
  • css图片适应div
  • list.php
  • 固定资产折旧计算方法公式大全
  • 公司缴纳残保金怎么做账
  • php获取随机数
  • php中定义函数
  • yii框架教程
  • 资本金什么时候可以退回
  • 小规模升级一般纳税人需要多久
  • 怎么冲暂估入账
  • 应收票据利息的确认
  • 为什么银行结息不加入账户
  • 用支票偿还货款
  • 织梦标签工具
  • 合同资产科目包含增值税吗
  • 会议费可以开餐费吗
  • 增值税发票丢失可以重开吗
  • 结转以后年度扣除的费用有哪些
  • 技术开发免征增值税怎么开票
  • 小规模纳税人可以抵扣进项税吗
  • sqlserver2005创建表
  • 固定资产清理往报表哪列示
  • 什么叫日常业务
  • 标书费没有发票合理吗
  • 餐费计入哪个科目合理避税
  • 新政府会计制度与旧制度区别
  • 交易性金融资产属于流动资产
  • 事业单位的财政拨款怎么做账
  • 公司与公司之间人与人之间最大的区别
  • 提前预支工资怎么打条子
  • 车辆使用费包括油费吗
  • 小规模现金流量表年报不填可以吗
  • 工程类发票账务后面需附什么单据呢
  • 什么是企业合并?
  • 商业企业可将商品分为哪三类
  • mysql存文章的字段设置为多大?
  • win2008如何安装telnet
  • FreeBSD mpd VPN服务器安装步骤
  • linux搭建l2tp服务器
  • win7关闭混合睡眠
  • win7系统如何关闭更新系统
  • win7开机假死
  • 如何判断电脑是不是linux
  • win7系统更新显卡驱动后黑屏无法启动
  • 举例说明Java实现适配器模式
  • pycharm安装教程2020.2
  • python 异常捕获
  • 个人所得税app查不到工资记录
  • 河南居民医保网上缴费查询
  • 地方税务局稽查局卢永胜
  • 广西12366医保缴费
  • 因公出差伙食补助标准
  • 差额征税差额开票怎么理解
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设