电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

通過PHP的Wrapper無縫遷移原有項目到新服務的實現(xiàn)方法

瀏覽:131日期:2022-09-10 18:48:13

出于性能和安全方面的考慮,公司的平臺上禁用了本地文件讀寫和對外的數(shù)據(jù)抓取.相應的,我們提供了對應的服務來做同樣的事情.新服務的接口和原來不太一樣.

專門為我們平臺開發(fā)的程序當然不會存在問題,但是有大量的已有的程序和開源項目,就面臨著繁雜的遷移工作.

Wrapper

其實從PHP4.3開始,PHP就支持Wrapper了,這意味著用戶可以自定義和重載協(xié)議.

只需要使用 stream_wrapper_register 函數(shù)就可以注冊一個協(xié)議,對這個協(xié)議的相關操作,PHP都會回調相關的函數(shù).

手冊上給了一個例子. 它注冊了一個叫var的協(xié)議,然后對這個協(xié)議操作都會回調VariableStream class里邊定義的方法.

varname = $url['host'];$this->position = 0;return true;}function stream_read($count){$ret = substr($GLOBALS[$this->varname], $this->position, $count);$this->position += strlen($ret);return $ret;}function stream_write($data){$left = substr($GLOBALS[$this->varname], 0, $this->position);$right = substr($GLOBALS[$this->varname], $this->position + strlen($data));$GLOBALS[$this->varname] = $left . $data . $right;$this->position += strlen($data);return strlen($data);}function stream_tell(){return $this->position;}function stream_eof(){return $this->position >= strlen($GLOBALS[$this->varname]);}function stream_seek($offset, $whence){switch ($whence) {case SEEK_SET:if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {$this->position = $offset;return true;} else {return false;}break;case SEEK_CUR:if ($offset >= 0) {$this->position += $offset;return true;} else {return false;}break;case SEEK_END:if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {$this->position = strlen($GLOBALS[$this->varname]) + $offset;return true;} else {return false;}break;default:return false;}}}stream_wrapper_register('var', 'VariableStream')or die('Failed to register protocol');$myvar = '';$fp = fopen('var://myvar', 'r+');fwrite($fp, 'line1n');fwrite($fp, 'line2n');fwrite($fp, 'line3n');rewind($fp);while (!feof($fp)) {echo fgets($fp);}fclose($fp);var_dump($myvar);?>

回調class里邊能實現(xiàn)的接口列表在這里: http://cn2.php.net/manual/en/class.streamwrapper.php

需要注意的一些問題

構造函數(shù)

首先是,wrapper class很特別,它的構造函數(shù)并不是每次都調用的.只有在你的操作觸發(fā)了stream_open相關的操作時才會調用,比如你用file_get_contents了.而當你的操作觸發(fā)和stream無關的函數(shù)時,比如file_exists會觸發(fā)url_stat方法,這個時候構造函數(shù)是不會被調用的.

讀實現(xiàn)

wrapper里邊有position和seek等概念,但是很多服務其實是一次性就讀取全部數(shù)據(jù)的,這個可以在stream_open的時候一次性讀回,放到一個屬性中,以后seek和tell的時候直接操作屬性里邊存放的數(shù)據(jù)就可以了.

url_stat的實現(xiàn)

在wrapper class的實現(xiàn)中,url_stat的實現(xiàn)是個難點.必須正確的實現(xiàn)url_stat才能使is_writable和is_readable等查詢文件元信息的函數(shù)正常工作.

而我們需要為我們的虛設備偽造這些值.以mc為例,我給大家一些參考數(shù)據(jù).

url_stat應該返回一個數(shù)組,分13個項,內容如下:

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 創(chuàng)建時間

blksize blocksize of filesystem IO 寫零即可

blocks number of 512-byte blocks allocated 寫零即可

其中mode的值必須寫對

如果是文件,其值為

0100000 + 文件權限 ; 如 0100000 + 0777;

如果是目錄,其值為

040000 + 目錄權限 ; 如 0400000 + 0777;

可以重載標準協(xié)議

根據(jù)實際測試來看,用stream_wrapper_unregister可以卸載掉http等內置協(xié)議.這就方便我們完全無縫的替換用戶的一些操作,比如file_get_contents(‘http://sae.sina.com.cn’)到我們自己實現(xiàn)的服務上.

知識點補充:

php wrapper實現(xiàn)

【背景】

做一個thrift client的wrapper,用以實現(xiàn)對于服務器的重試邏輯。

【關鍵點】

1. wrapper要求跟用client一樣方便。

2. 當某個服務器掛掉之后可以隨機選另一臺重試。

3. 用到的php幾個關鍵特性: __call()(magic function,當訪問的對象函數(shù)不存在時會調用這個), ReflectionClass 反射類及其其成員函數(shù)newInstanceArgs , call_user_func_array回調函數(shù)。

直接看代碼吧(某位牛人寫的,not me):

#!/usr/bin/env php<?php namespace wrapper; error_reporting(E_ALL); require_once ’/usr/local/Cellar/thrift/0.9.1/Thrift/ClassLoader/ThriftClassLoader.php’; use ThriftClassLoaderThriftClassLoader; $GEN_DIR = realpath(dirname(__FILE__).’/..’).’/gen-php’; $loader = new ThriftClassLoader();$loader->registerNamespace(’Thrift’, ’/usr/local/Cellar/thrift/0.9.1/’);$loader->registerDefinition(’xiaoju’, $GEN_DIR);$loader->register(); use ThriftProtocolTBinaryProtocol;use ThriftTransportTSocket;use ThriftTransportTHttpClient;use ThriftTransportTBufferedTransport;use ThriftExceptionTException; class RetryWrapper { public function __construct($classname, $hosts) { $this->clazz = new ReflectionClass($classname); $this->hosts = $hosts; } public function __call($method, $args) { shuffle($this->hosts); foreach ($this->hosts as $key => $host) { try {return $this->inner_call($host, $method, $args); } catch (TException $ex) {$msg = $ex->getMessage();if (!strstr($msg, ’TSocket’)) { throw $ex;} } } throw new TException('all server down!'); } public function inner_call($host, $method, $args) { $tmp = explode(':', $host); $socket = new TSocket($tmp[0], (int)$tmp[1]); $transport = new TBufferedTransport($socket, 1024, 1024); $protocol = new TBinaryProtocol($transport); $client = $this->clazz->newInstanceArgs(array($protocol)); $transport->open(); $result = call_user_func_array(array($client, $method), $args); $transport->close(); return $result; }} $hosts = array(’localhost:9090’, ’localhost:9091’);$wrapper = new RetryWrapper('xxxxxMessageServiceClient', $hosts, 3); $data = array(’businessId’ => 300100001, ’phones’ => array(’2’,’2’,’3’), ’message’ => ’asdfqer’) ;$message = new xxxxxMessage($data); print $wrapper->sendMessage($message);print 'n'; ?>

總結

到此這篇關于通過PHP的Wrapper無縫遷移原有項目到新服務的實現(xiàn)方法的文章就介紹到這了,更多相關php wrapper 遷移新服務內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: PHP
相關文章:
主站蜘蛛池模板: 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 蓝牙音频分析仪-多功能-四通道-八通道音频分析仪-东莞市奥普新音频技术有限公司 | 江西自考网-江西自学考试网 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 广西教师资格网-广西教师资格证考试网 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 钢格板_钢格栅_格栅板_钢格栅板 - 安平县鑫拓钢格栅板厂家 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 技德应用| 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 一点车讯-汽车网站,每天一点最新车讯! | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜| 国际线缆连接网 - 连接器_线缆线束加工行业门户网站 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 |