亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 通過PHP的Wrapper無縫遷移原有項目到新服務的實現方法

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

熱門標簽:邢臺400電話辦理 正規電銷機器人系統 咸陽電銷 辦理400電話哪家好點 濟源百應電銷機器人聯系方式 南京3D地圖標注 嘟嘟云外呼系統 南寧電話外呼系統線路 重慶外呼電銷系統多少錢

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

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

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, "line1\n");

fwrite($fp, "line2\n");

fwrite($fp, "line3\n");

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 Thrift\ClassLoader\ThriftClassLoader;
 
$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 Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\THttpClient;
use Thrift\Transport\TBufferedTransport;
use Thrift\Exception\TException;
 
 
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("\xxx\xx\MessageServiceClient", $hosts, 3);
 
$data = array('businessId' => 300100001, 'phones' => array('2','2','3'), 'message' => 'asdfqer') ;
$message = new \xxx\xx\Message($data);
 
print $wrapper->sendMessage($message);
print "\n";
 
?>

總結

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

您可能感興趣的文章:
  • PHP流Streams、包裝器wrapper概念與用法實例詳解
  • PHP Wrapper在SAE上的應用方法

標簽:黃山 通遼 平頂山 南通 河南 唐山 隴南 武漢

巨人網絡通訊聲明:本文標題《通過PHP的Wrapper無縫遷移原有項目到新服務的實現方法》,本文關鍵詞  通過,PHP,的,Wrapper,無縫,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《通過PHP的Wrapper無縫遷移原有項目到新服務的實現方法》相關的同類信息!
  • 本頁收集關于通過PHP的Wrapper無縫遷移原有項目到新服務的實現方法的相關信息資訊供網民參考!
  • 推薦文章
    黄色福利片| 国产一区精品| 日本在线播放一区| 欧美大片a一级毛片视频| 久久国产精品永久免费网站| 一级女人毛片人一女人| 久草免费资源| 亚洲天堂在线播放| 欧美激情一区二区三区视频高清| 国产91精品一区二区| 麻豆系列国产剧在线观看| 午夜精品国产自在现线拍| 成人免费观看网欧美片| 欧美激情一区二区三区中文字幕| 欧美一级视频免费观看| 精品在线视频播放| 九九干| 成人免费网站久久久| 免费一级片在线| 日本在线不卡免费视频一区| 国产91素人搭讪系列天堂| 欧美大片a一级毛片视频| 日韩在线观看视频免费| 久久国产精品自由自在| 亚洲www美色| 国产成人欧美一区二区三区的| 国产一区二区福利久久| 99热精品在线| 999久久狠狠免费精品| 亚洲女初尝黑人巨高清在线观看| 亚欧乱色一区二区三区| 国产综合91天堂亚洲国产| 日韩专区亚洲综合久久| 午夜欧美成人久久久久久| 久久99这里只有精品国产| 久久国产影院| 成人免费观看视频| 精品国产一区二区三区久 | 欧美大片毛片aaa免费看| 美女免费毛片| 日韩免费片| 高清一级淫片a级中文字幕| 成人免费观看网欧美片| 九九精品在线| 九九久久99| 日韩一级黄色| 久久精品店| 97视频免费在线| 成人a大片高清在线观看| 日本在线不卡免费视频一区| 青青久久网| 国产视频一区在线| 国产网站免费观看| 日韩欧美一二三区| 久久福利影视| 国产不卡精品一区二区三区| 久久国产精品自由自在| 色综合久久天天综合| 日本特黄特色aaa大片免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产一区二区精品久久91| 99热热久久| 青草国产在线| 一a一级片| 国产91精品露脸国语对白| 亚州视频一区二区| 国产一区二区精品| 欧美α片无限看在线观看免费| 国产亚洲免费观看| 九九精品久久| 亚洲爆爽| 精品视频一区二区三区免费| 麻豆网站在线看| 国产欧美精品午夜在线播放| 欧美激情在线精品video| 日韩专区一区| 国产成人女人在线视频观看 | 天天做日日爱夜夜爽| 日韩免费片| 精品在线免费播放| 一本伊大人香蕉高清在线观看| 一级女性全黄久久生活片| 欧美一级视频免费观看| 日日夜夜婷婷| 欧美爱爱网| 成人免费高清视频| 成人高清护士在线播放| 四虎影视库国产精品一区| 欧美1区| 国产麻豆精品| 日韩在线观看视频网站| 成人影视在线播放| 黄色短视频网站| 午夜久久网| 韩国毛片 免费| 九九久久99| 久草免费资源| 久久国产精品自线拍免费| 日韩中文字幕在线亚洲一区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲天堂免费| 午夜在线观看视频免费 成人| 成人a大片高清在线观看| 日韩专区亚洲综合久久| 黄色福利| 日韩中文字幕在线亚洲一区| 精品国产香蕉伊思人在线又爽又黄| 久久久久久久久综合影视网| 日韩欧美一二三区| 欧美大片aaaa一级毛片| 麻豆系列国产剧在线观看| 日韩专区亚洲综合久久| 久草免费在线观看| 久久国产影视免费精品| 99久久精品国产片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产精品1024在线永久免费| 欧美18性精品| 超级乱淫黄漫画免费| 九九干| 日韩专区在线播放| 你懂的在线观看视频| 日本在线播放一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美日本二区| 欧美一级视频免费观看| 国产视频一区在线| 成人免费观看网欧美片| 高清一级做a爱过程不卡视频| 99久久精品国产高清一区二区| 午夜精品国产自在现线拍| 亚欧成人毛片一区二区三区四区| 日韩在线观看视频网站| 国产精品免费精品自在线观看| 久久99欧美| 九九精品在线| 韩国毛片 免费| 国产激情视频在线观看| 国产成人精品综合久久久| 欧美激情影院| 黄视频网站在线看| 国产伦理精品| 久久精品店| 韩国三级香港三级日本三级la| 中文字幕一区二区三区精彩视频| 日本免费乱理伦片在线观看2018| 高清一级做a爱过程不卡视频| 一本高清在线| 韩国三级香港三级日本三级la| 国产不卡在线观看视频| 国产一区国产二区国产三区| 九九精品久久| a级黄色毛片免费播放视频| 成人免费观看的视频黄页| 成人a大片在线观看| 国产一区二区精品| 免费毛片播放| 毛片电影网| 高清一级毛片一本到免费观看| 久久久成人网| 国产国语对白一级毛片| 国产成人精品综合在线| 天天做人人爱夜夜爽2020| 欧美大片一区| 免费国产在线视频| 久久精品欧美一区二区| 日韩男人天堂| 国产a毛片| 美女免费毛片| 黄色福利片| 亚洲女人国产香蕉久久精品| 欧美另类videosbestsex视频| 成人a大片高清在线观看| 精品久久久久久影院免费| 99久久精品国产片| 沈樵在线观看福利| 欧美日本二区| 美女免费毛片| 精品在线视频播放| 日韩一级黄色| 成人免费网站视频ww| 国产视频一区二区三区四区 | 亚洲天堂免费| 色综合久久天天综线观看| 99色视频| 黄视频网站免费| 国产成人精品综合久久久| 一级片片| 色综合久久天天综线观看| 免费一级片在线| 国产不卡在线播放| 欧美爱爱网| 欧美激情影院| 999精品在线| 欧美国产日韩一区二区三区| 成人影视在线观看| 麻豆污视频| 精品国产亚洲人成在线| 免费一级生活片| 国产a毛片|