天天看點

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

最近聽說有個東東重新定義了"世界上最好的語言",激動一查原來大名叫swoole,

你看下它的官方定義:

php的異步、并行、高性能網絡通信引擎,使用純c語言編寫,提供了php語言的異步多線程伺服器,異步tcp/udp網絡用戶端,異步mysql,異步redis,資料庫連接配接池,asynctask,消息隊列,毫秒定時器,異步檔案讀寫,異步dns查詢。 swoole内置了http/websocket伺服器端/用戶端、http2.0伺服器端。 swoole2.0支援了類似go語言的協程,可以使用完全同步的代碼實作異步程式。php代碼無需額外增加任何關鍵詞,底層自動進行協程排程,實作異步。

你再看它有多牛:

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

上面的引用的都來自人民日報噢不,是官方定義,不管你信不信,反正我有點方。。。

既然它辣麼好,那oss php sdk必須支援啊(沒錯我隻是想告訴你它怎麼用,oss php sdk沒毛病,别上來就歧視俺們是殘障人士)。

廢話說那麼多,幹貨還沒見到。下面就說說oss php sdk怎麼和swoole搞基。

别看人民日報上說的swoole根正苗紅的擴充,我簡單調查下它

<code>php -m | grep swoole</code>

盡然為空、為空、為空。。。是以要自行安裝swoole,如果你和我一樣安裝了php7和pecl,你可以直接,

<code>pecl install swoole</code>

然後用php -info | grep php.ini檢視loaded configuration file(隻有它能讓php擴充幹活)具體是哪個,對于我的環境是/etc/php/7.0/cli/php.ini這個檔案,你需要

<code>vim /etc/php/7.0/cli/php.ini</code>

然後添加

<code>extension = "swoole.so"</code>

或者你可以自行編譯安裝swoole(什麼?不會?google一搜滿屏都是方法),隻要和下面一樣我們就可以繼續玩。

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

既然是在oss php sdk中玩轉swoole,那必須要把php sdk搞起呀。方法很簡單,方法如下:

cd aliyun-oss-php-sdk/

配置好samples/config.php #相信你肯定不是第一次用oss

php sample/swoole.php #運作我們提前放好的sample程式

curl 127.0.0.1:9503

是不是出現了 hello swoole

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

這就證明swoole和oss php sdk正式搞在一起了。

前面已經可以通過swoole通路oss了,但在伺服器端更普遍的做法是使用nginx作為前端代理,通過nginx反向代理伺服器通路我們起的swoole server。

具體的步驟:(已安裝nginx的自覺跳過)

tar -zxvf nginx-1.11.3.tar.gz #解壓

cd nginx-1.11.3

./configure --prefix=/usr/local/nginx #配置

需要安裝 libpcre3-dev,指令為:sudo apt-get install libpcre3-dev

sudo make install

sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #注意:-c 指定配置檔案的路徑,不加的話,nginx會自動加載預設路徑的配置檔案,可以通過 -h檢視幫助指令。

ps -ef | grep nginx #檢視nginx程序:

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

如果是這樣說明nginx正常工作了,下面用nginx反向代理127.0.0.1:9503,修改 /usr/local/nginx/conf/nginx.conf如下:

reload nginx使配置生效

/usr/local/nginx/sbin/nginx -s reload

vim /etc/hosts,添加 <code>127.0.0.1 www.swoole.com</code>

驗證結果,curl www.swoole.com 或者浏覽器打開這個域名,是不是還是出現 hello swoole了。

廢了這麼大功夫,如果隻出現了個hello swoole是太low了點,我不劇透你耐心往下看。

在./aliyun-oss-php-sdk目錄下有個sample.jpg檔案, 簡單上傳檔案示例代碼如下,

執行并檢視結果:

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

這是最簡單的oss上傳下載下傳檔案用法。

仿照上面的步驟在swoole server中調用oss php sdk,并作nginx代理後,最簡單的oss上傳下載下傳代碼變成了這樣:

php sample/swoole.php

curl www.swoole.com

是不是發現長時間沒反應,nginx報個錯誤。檢視nginx的accesslog,發現報504。打開我們在swoole中設定的swoole_http_server.log發現:

oss php sdk基于swoole的簡單HTTP伺服器實作前言一、安裝swoole二、玩轉oss php sdk三、設定nginx做反向代理四、swoole使用經驗貼

這裡有兩層問題:

問題一:從報錯發現是oss php sdk沒有找到這個example.jpg檔案,example.jpg明明是個本地檔案為什麼會找不到?

問題二:即使有這個錯誤為什麼會造成nginx報504?

如何去解這兩個問題?

對于問題一應該是swoole的坑,實際測試發現,swoole下相對路徑是從根目錄"/"算的,而不是目前目錄。是以把檔案寫成絕對路徑就ok了。

對于問題二我的了解是swoole的使用者必須去包裝它所調用接口抛出的錯誤,對本文來說當然就是oss php sdk抛出的錯誤,以讓nginx正确識别。

繼續閱讀