本篇内容介绍了”如何通过PHP无缝迁移原有项目到新服务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
出于性能和安全方面的考虑,公司的平台上禁用了本地文件读写和对外的数据抓取。相应的,我们提供了对应的服务来做同样的事情。新服务的接口和原来不太一样。
专门为我们平台开发的程序当然不会存在问题,但是有大量的已有的程序和开源项目,就面临着繁杂的迁移工作。
<强>包装强>
其实从PHP4.3开始,PHP就支持包装了,这意味着用户可以自定义和重载协议。
只需要使用<代码> stream_wrapper_register 代码>函数就可以注册一个协议,对这个协议的相关操作,PHP都会回调相关的函数。
手册上给了一个例子。它注册了一个叫var的协议,然后对这个协议操作都会回调<代码> 代码>里VariableStream类边定义的方法。
varname =, $ url (“host");=$ this→position 0; return 真实; } function stream_read(美元数) { 美元$ ret =, substr(全局变量($ this→varname],,这→美元地位,,美元数); +=$ this→position strlen (ret); return 随著美元; } function stream_write(元数据) { 美元$ left =, substr(全局变量($ this→varname],, 0,, $ this→位置); 美元$ right =, substr(全局变量($ this→varname],, $ this→position +, strlen(元数据)); 美元的全局变量($ this→varname],=, left 美元;只data 美元;只对美元; +=$ this→position strlen(元数据); return strlen(元数据); } function stream_tell () { return 这→美元地位; } function stream_eof () { return 这→美元position 祝辞=,strlen(全局美元($ this→varname]); } function stream_seek(抵消美元,,那里) { switch (那里),{ case SEEK_SET: if (offset 美元;& lt;, strlen(全局美元($ this→varname]),,,, offset 美元;祝辞=,0),{=$ this→position 抵消美元; return 真实; },{else return 假; } 打破; case SEEK_CUR: if (offset 美元;祝辞=,0),{ +=$ this→position 抵消美元; return 真实; },{else return 假; } 打破; case SEEK_END: 美元if (strlen(全局变量($ this→varname]), +, offset 美元;祝辞=,0),{=$ this→position strlen(全局美元($ this→varname]), +,抵消美元; return 真实; },{else return 假; } 打破; 默认值: return 假; } } } stream_wrapper_register (“var",,“VariableStream") 或死亡(“Failed 用register protocol"); $ myvar =,““ $ fp =, fopen (“var://myvar",,“r +“); 写入文件(fp美元,“line1 \ n"); 写入文件(fp美元,“么\ n"); 写入文件(fp美元,“line3 \ n"); 倒带(fp); while (! feof (fp)美元),{ 美元echo fgets (fp); } 文件关闭(fp); var_dump ($ myvar); ?在
回调课里边能实现的接口列表在这里:http://cn2.php.net/manual/en/class.streamwrapper.php
<强>需要注意的一些问题强>
<强>构造函数强>
首先是,<代码>包装类> 代码很特别,它的构造函数并不是每次都调用的。只有在你的操作触发了stream_open相关的操作时才会调用,比如你用函数<代码> 代码>了。而当你的操作触发和流无关的函数时,比如file_exists会触发url_stat方法,这个时候构造函数是不会被调用的。
<强>读实现强>
包装里边有地位和追求等概念,但是很多服务其实是一次性就读取全部数据的,这个可以在<代码> stream_open> 代码的时候一次性读回,放到一个属性中,以后寻求和告诉的时候直接操作属性里边存放的数据就可以了。
<>强url_stat的实现
强>
在包装类的实现中,url_stat的实现是个难点。必须正确的实现url_stat才能使