亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP Wrapper在SAE上的應用方法

2024-05-04 23:45:29
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP Wrapper在SAE上的應用方法,詳細介紹了PHP Wrapper的功能、定義與使用技巧,進一步分析了在新浪SAE平臺上進行文件寫操作的具體實現技巧,需要的朋友可以參考下
 

本文講述了PHP Wrapper在SAE上的應用方法。分享給大家供大家參考,具體如下:

一、PHP Wrapper是什么

自PHP 4.3開始,PHP開始允許用戶通過stream_wrapper_register()自定義URL風格的協議。用戶使用fopen(), copy()等文件系統函數對封裝協議進行操作時,PHP會調用注冊協議時所提供的類中相應的函數。
PHP手冊中給了一個例子,它將VariableStream類注冊為var://協議,通過這個協議,用戶可以使用文件系統函數直接讀寫全局變量。例如,用戶可以通過 “var://foo” 讀寫 $GLOBALS['foo'] 。

二、SAE為什么需要PHP Wrapper

出于性能和安全方面的考慮,SAE平臺上禁用了本地文件讀寫和對外的數據抓取。相應的,我們提供了對應的服務來做同樣的事情。

由于新服務的接口和PHP本身的接口不太一樣,專門為我們平臺開發的程序當然不會存在問題,但是大量已有的程序和開源項目,就面臨著繁雜的遷移工作。而使用PHP Wrapper對我們的服務的接口進行封裝之后,用戶就可以更方便地將程序遷移到SAE平臺。

三、如何寫PHP Wrapper

要通過PHP Wrapper封裝一個協議,首先,我們需要寫一個 streamWrapper 類,類名可自定義,類的格式為:

streamWrapper {public resource $context ;__construct ( void )public bool dir_closedir ( void )public bool dir_opendir ( string $path , int $options )public string dir_readdir ( void )public bool dir_rewinddir ( void )public bool mkdir ( string $path , int $mode , int $options )public bool rename ( string $path_from , string $path_to )public bool rmdir ( string $path , int $options )public resource stream_cast ( int $cast_as )public void stream_close ( void )public bool stream_eof ( void )public bool stream_flush ( void )public bool stream_lock ( mode $operation )public bool stream_open ( string $path , string $mode , int $options , string &$opened_path )public string stream_read ( int $count )public bool stream_seek ( int $offset , int $whence = SEEK_SET )public bool stream_set_option ( int $option , int $arg1 , int $arg2 )public array stream_stat ( void )public int stream_tell ( void )public int stream_write ( string $data )public bool unlink ( string $path )public array url_stat ( string $path , int $flags )}

類中各方法說明:

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手冊:http://cn2.php.net/manual/en/class.streamwrapper.php

寫好streamWrapper類之后,使用 stream_wrapper_register () 將這個類注冊到Wrapper中,就可以開始使用了。函數使用方法為:

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

例如:

stream_wrapper_register("saemc", "SaeMemcacheWrapper");

由于SAE平臺不支持對本地文件的寫操作,因此Smarty之類的一些需要在本地寫文件的開源項目就沒辦法直接在SAE平臺上使用,而有了saemc Wrapper,用戶就可以將Smarty編譯的模板保存在MC中,很方便的將Smarty遷移到SAE平臺上來。

在附件中我們為大家提供了SAE上Memcache Wrapper的實現代碼,大家可以下載此附件進行測試。

在測試之前,需要先在本地啟動一個端口為22222的Memcached服務:

memcached -m 10 -p 22222 -u nobody -l 127.0.0.1

然后使用下面代碼就可以測試了:

//包含附件代碼,注冊saemc Wrapperinclude_once('wrapper.php');//測試 saemc Wrapper$fp = fopen( "saemc://test.txt", "w+" ) or die("fopen faild!");fwrite( $fp, "line1/n" ) or die("fwrite line1 faild!");fwrite( $fp, "line2/n" ) or die("fwrite line2 faild!");fwrite( $fp, "line3/n" ) or die("fwrite line3 faild!");var_dump(ftell($fp));fseek( $fp, 0 );while ( !feof( $fp ) ) {    $c = fgets( $fp ) or die("fgets faild!");      var_dump($c);}fclose( $fp );var_dump(file_get_contents("saemc://test.txt"));var_dump(file_put_contents("saemc://path/test.txt", "hello world!/n"));var_dump(file_put_contents("saemc://path/test.txt", "hello world!/n", FILE_APPEND));var_dump(file_get_contents("saemc://path/test.txt"));var_dump(copy("saemc://path/test.txt", "saemc://path/test_new.txt"));var_dump(file_get_contents("saemc://path/test_new.txt"));var_dump(unlink("saemc://path/test.txt"));var_dump(file_get_contents("saemc://path/test.txt"));var_dump(rename("saemc://path/test_new.txt", "saemc://path/test.txt"));var_dump(file_get_contents("saemc://path/test.txt"));echo "====test include====/n";include_once("saemc://path/test.txt");

測試頁面的輸出結果:

int(18)string(6) "line1"string(6) "line2"string(6) "line3"string(18) "line1line2line3"int(13)int(13)string(26) "hello world!hello world!"bool(true)string(26) "hello world!hello world!"bool(true)bool(false)bool(true)string(26) "hello world!hello world!"====test include====hello world!hello world!

我們提供的 Memcache Wrapper并沒有實現目錄操作的一些方法和Memcache的Timeout,大家可以參考PHP手冊,嘗試實現目錄操作,或者通過context使這個Wrapper支持Memcache的Timeout。

另外,大家可以到下面這個地址查看SAE Stdlib中sae_include的源碼,在其中還有我們為Storage服務封裝的saestor Wrapper和為Fetchurl服務重新封裝的http Wrapper的實現:

http://stdlib.sinaapp.com/?f=sae_include.function.php

四、寫Wrapper時的一些注意事項

1. 構造函數

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應該返回一個數組,分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 - 文件大?。?br /> atime - 最后讀時間 格式為unix時間戳;
mtime - 最后寫時間;
ctime - 創建時間;
blksize - blocksize of filesystem IO 寫零即可;
blocks - number of 512-byte blocks allocated 寫零即可;

其中mode的值必須寫對:

如果是文件,其值為:

0100000 + 文件權限,如 0100000 + 0777。

如果是目錄,其值為:

040000 + 目錄權限,如 0400000 + 0777。

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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品三级视频福利| 欧美成人精品不卡视频在线观看| 色偷偷偷综合中文字幕;dd| 成人午夜在线视频一区| 久久精品国产69国产精品亚洲| 国产成人一区二区三区电影| 日韩av中文字幕在线免费观看| 久久久91精品| 亚洲欧美一区二区三区情侣bbw| 亚洲激情电影中文字幕| 成人美女免费网站视频| 欧美体内谢she精2性欧美| 久久精品久久精品亚洲人| 国产午夜精品全部视频在线播放| 亚洲激情视频网站| 亚洲无av在线中文字幕| 成人免费网站在线观看| 日本欧美精品在线| 国产成人精品av在线| 国产成人中文字幕| 欧美激情乱人伦| 国产日本欧美一区二区三区在线| 日韩麻豆第一页| 91精品国产色综合久久不卡98口| 日本一欧美一欧美一亚洲视频| 日韩av在线免费观看一区| 欧美日韩美女在线| 久久久久久久久久国产精品| 日韩精品福利网站| 国产精彩精品视频| 另类天堂视频在线观看| 96国产粉嫩美女| 91天堂在线视频| 日韩精品亚洲精品| 国产欧美日韩精品丝袜高跟鞋| 成人黄色av网站| 久久夜精品va视频免费观看| 亚洲性xxxx| 91精品国产91久久久久久最新| 亚洲精品网站在线播放gif| 日韩在线观看免费全集电视剧网站| 最近2019年手机中文字幕| 91久久久久久| 欧美亚洲国产成人精品| 亚洲高清在线观看| 日韩欧美成人免费视频| 欧美肥老太性生活视频| 亚洲va欧美va国产综合久久| 国产成人在线一区二区| 久久久免费高清电视剧观看| 欧美在线视频播放| 91精品中国老女人| 91高清视频在线免费观看| 精品美女国产在线| 欧美视频二区36p| 欧美理论电影网| 国产精品露脸自拍| 亚洲摸下面视频| 日韩中文在线中文网三级| 亚洲欧美日韩精品久久| 精品亚洲一区二区三区| 亚洲全黄一级网站| 精品久久久国产| 国产综合香蕉五月婷在线| 国产精品视频yy9099| 国产精品www| 亚洲国产古装精品网站| 欧美日韩一区二区三区在线免费观看| 大量国产精品视频| 538国产精品视频一区二区| 国产日本欧美一区二区三区| 国产精品三级美女白浆呻吟| 九九精品视频在线观看| 久久久久久一区二区三区| 黄色成人av网| 欧美日韩成人精品| 91日本视频在线| 久久网福利资源网站| 亚洲在线视频观看| 日本欧美国产在线| 国产成人啪精品视频免费网| 久久久久久久久久久国产| 国产精品天天狠天天看| 亚洲一区亚洲二区| 亚洲欧美另类国产| 一本色道久久88综合亚洲精品ⅰ| 性色av一区二区三区免费| 国产这里只有精品| 综合136福利视频在线| 大胆欧美人体视频| 亚洲精品suv精品一区二区| 国产日韩在线免费| 最好看的2019的中文字幕视频| 日韩在线观看视频免费| 亚洲专区在线视频| 国产成人精品视频在线| 91成人免费观看网站| 亚洲人成自拍网站| 国产在线精品成人一区二区三区| 欧美视频中文字幕在线| 色哟哟亚洲精品一区二区| 亚洲白拍色综合图区| 亚洲最大的成人网| 18久久久久久| 国产精品福利网| 成人一区二区电影| 在线不卡国产精品| 国产成人精品一区二区| 国产成人精品优优av| 在线精品91av| 日韩欧亚中文在线| 亚洲japanese制服美女| 亚洲综合中文字幕68页| 亚洲国语精品自产拍在线观看| 国产精品久久久久久久久久尿| 国产亚洲在线播放| 久久久久久国产| 亚洲精品久久久久久下一站| 国产精品ⅴa在线观看h| 26uuu另类亚洲欧美日本老年| 国产一区二区三区视频免费| 在线观看视频99| 国产在线久久久| 欧美最猛性xxxxx免费| 97在线视频精品| 主播福利视频一区| 在线看福利67194| 亚洲色无码播放| 国产精品1区2区在线观看| 日韩性生活视频| 国产在线精品成人一区二区三区| 91豆花精品一区| 丝袜亚洲欧美日韩综合| 欧美日韩一区二区三区在线免费观看| 在线日韩欧美视频| 成人激情免费在线| 精品久久久久久电影| 国产丝袜视频一区| 欧美日韩xxxxx| 一区二区在线视频播放| 自拍偷拍亚洲区| 亚洲剧情一区二区| 亚洲欧美日韩天堂| 欧美成年人视频网站欧美| 久久久久亚洲精品成人网小说| 亚洲最新av在线网站| 亚洲一区二区三区成人在线视频精品| 国产精品美女免费视频| 成人性生交大片免费看视频直播| 欧美最猛性xxxxx亚洲精品| 91性高湖久久久久久久久_久久99| 538国产精品一区二区免费视频| 国产成人精品在线播放| 91产国在线观看动作片喷水| 欧美日韩中文字幕综合视频| 97国产suv精品一区二区62| 亚洲精品小视频在线观看| 久久综合色88| 日韩激情片免费| 国产精品va在线| 国产精品xxxxx| 亚洲性猛交xxxxwww| 91精品综合视频| 这里只有视频精品|