日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

Wrapper

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

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

手冊上給了一個例子. 它注冊了一個叫var的協議,然后對這個協議操作都會回調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里邊能實現的接口列表在這里: http://cn2.php.net/manual/en/class.streamwrapper.php

需要注意的一些問題

構造函數

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

讀實現

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

url_stat的實現

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

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

url_stat應該返回一個數組,分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 創建時間

blksize blocksize of filesystem IO 寫零即可

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

其中mode的值必須寫對

如果是文件,其值為

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

如果是目錄,其值為

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

可以重載標準協議

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

知識點補充:

php wrapper實現

【背景】

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

【關鍵點】

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

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

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

直接看代碼吧(某位牛人寫的,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無縫遷移原有項目到新服務的實現方法的文章就介紹到這了,更多相關php wrapper 遷移新服務內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩综合| 免费欧美日韩| 日韩福利视频导航| 久久国产福利| 免费观看在线综合| 久久av一区| 四虎4545www国产精品| 伊人久久国产| 久久精品123| 欧美日韩在线观看视频小说| 三级精品视频| 欧美成人日韩| 最新国产拍偷乱拍精品| 黄色欧美日韩| 男人的天堂亚洲一区| 亚洲国产一区二区在线观看| 色一区二区三区四区| 韩国久久久久久| 久久精品免费一区二区三区| 婷婷激情久久| 蜜桃免费网站一区二区三区| 91伊人久久| 色欧美自拍视频| 国产综合视频| 午夜精品影视国产一区在线麻豆| 亚洲精品成人一区| 欧美黄色一区| 欧美三区四区| 蜜臀国产一区二区三区在线播放 | 久久伊人国产| 国产精品久久久久av电视剧| 精品一区三区| 日韩avvvv在线播放| 美女久久99| 久久久久网站| 中文字幕一区二区三区在线视频| 日本欧美一区二区| 国产白浆在线免费观看| 黄色亚洲免费| 日韩av资源网| 97se综合| 亚洲人成网站在线在线观看| 欧美91在线|欧美| 日韩黄色大片| 亚洲一区二区动漫| 日本少妇一区二区| 深夜福利视频一区二区| 在线亚洲自拍| 国产精品视频一区二区三区四蜜臂 | 国产麻豆一区二区三区| 免费一级片91| 国内一区二区三区| 国产精品日本| 国产精品99久久免费观看| 中国字幕a在线看韩国电影| 中文日韩欧美| 老司机精品视频在线播放| 婷婷国产精品| 毛片不卡一区二区| 日韩一区欧美二区| 成人在线观看免费视频| 免费视频一区二区| 国产va在线视频| 日韩精品三区四区| 色婷婷色综合| 欧美日韩a区| 亚洲高清二区| 国产精品白浆| 午夜一级在线看亚洲| 久久免费视频66| 麻豆精品网站| 日韩电影免费在线观看| 日本不卡高清视频| 欧美日韩精品一区二区视频| 久久超碰99| 亚洲欧美网站在线观看| 99久久久国产精品美女| 亚洲精品九九| 亚洲激情国产| 日韩一区电影| 国产精品大片免费观看| 视频一区二区三区中文字幕| 九色porny丨国产首页在线| 国产日韩一区二区三区在线| 九九久久电影| 欧美激情另类| 国产欧美日韩一级| 免费观看在线综合| 99久精品视频在线观看视频| 久久三级中文| 国产精品一国产精品k频道56| 亚洲一区二区三区在线免费| 99久久精品国产亚洲精品| 精品日韩一区| 日韩不卡一二三区| 丝袜美腿亚洲一区| 欧美片第1页综合| 亚洲精品成人一区| 黄色在线一区| 精品免费av在线| 成人污污视频| 美腿丝袜亚洲三区| 国产毛片久久久| 91精品视频一区二区| 天堂av在线一区| 亚洲视频www| 亚洲在线网站| 国产精品免费看| 亚洲黄色在线| 一区免费在线| 亚洲一级黄色| 视频小说一区二区| 麻豆网站免费在线观看| 精品国产a一区二区三区v免费| 日本精品国产| 亚洲精品三级| 中文字幕免费一区二区| 久热精品在线| 亚洲一级淫片| 日韩欧美中文字幕在线视频| 中文字幕免费一区二区| 亚洲精品少妇| 日产欧产美韩系列久久99| 日韩精品一区二区三区中文| 亚洲精品视频一二三区| 日本在线成人| 欧美日韩亚洲一区| 国产日韩欧美三级| 欧美一级网址| 日本麻豆一区二区三区视频| 日韩精品第一| 欧美日韩a区| 欧美国产先锋| 九九九精品视频| 国产一区二区三区黄网站| 中文字幕高清在线播放| 99久久久国产精品美女| 伊人精品视频| 男人的天堂亚洲一区| 日韩综合一区二区| 国产免费久久| 国产精品麻豆成人av电影艾秋| 久久精品国产99国产| 都市激情国产精品| 国产亚洲一区二区手机在线观看| 免费福利视频一区二区三区| 亚洲午夜91| 一区二区三区四区日韩| 欧美一区激情| 久久午夜影院| 99视频精品视频高清免费| 亚洲免费观看| 久热re这里精品视频在线6| 日韩欧美久久| 国产精品久久久网站| 毛片在线网站| 亚洲少妇诱惑| 97se亚洲| а√在线中文在线新版| 91精品亚洲| 日韩二区在线观看| 精品国产亚洲日本| 欧美va亚洲va日韩∨a综合色| 亚洲精品美女| 97精品国产福利一区二区三区| 最新日韩欧美| 国产精品1区| 狠狠操综合网| 国产福利电影在线播放| 午夜亚洲精品| 精品视频97| 亚洲自拍另类| 精品一区二区三区免费看| 婷婷中文字幕一区| 日韩高清电影免费| 一区二区三区四区日本视频| 日韩精品一二三区| 国产videos久久| 亚洲一区二区三区高清不卡| 国产精品久久久久9999高清| 97久久亚洲| 国产一区久久| 国产精品丝袜在线播放| 欧美久久精品一级c片| 国产探花一区| 欧美午夜不卡| 国产在线观看91一区二区三区| 亚洲男女自偷自拍| 日本一二区不卡| 日本在线观看不卡视频| 中文字幕在线视频网站| 亚洲人成网77777色在线播放| 国产中文在线播放| 日本不卡一区二区| 激情五月综合| 国产一区二区三区四区二区| 亚洲三级av| 99热精品久久| 精品久久不卡| 奇米亚洲欧美|