oss php sdk基於swoole的簡單HTTP服務器實現
前言
最近聽說有個東東重新定義了"世界上最好的語言",激動一查原來大名叫swoole,
你看下它的官方定義:
PHP的異步、並行、高性能網絡通信引擎,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,異步Redis,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole內置了Http/WebSocket服務器端/客戶端、Http2.0服務器端。
Swoole2.0支持了類似Go語言的協程,可以使用完全同步的代碼實現異步程序。PHP代碼無需額外增加任何關鍵詞,底層自動進行協程調度,實現異步。
上麵的引用的都來自人民日報噢不,是官方定義,不管你信不信,反正我有點方。。。
既然它辣麼好,那oss php sdk必須支持啊(沒錯我隻是想告訴你它怎麼用,oss php sdk沒毛病,別上來就歧視俺們是殘疾人)。
廢話說那麼多,幹貨還沒見到。下麵就說說oss php sdk怎麼和swoole搞基。
安裝swoole
別看人民日報上說的swoole根正苗紅的擴展,我簡單調查下它php -m | grep swoole
盡然為空、為空、為空。。。所以要自行安裝swoole,如果你和我一樣安裝了php7和pecl,你可以直接,pecl install swoole
用php -info | grep php.ini查看Loaded Configuration File具體是哪個,對於我的環境是/etc/php/7.0/cli/php.ini這個文件,vim /etc/php/7.0/cli/php.ini
extension = "swoole.so"
或者你可以編譯安裝swoole,隻要和下麵一樣我們就可以繼續玩。
使用oss php sdk
從oss php sdk的代碼地址下載代碼,
- git clone https://github.com/aliyun/aliyun-oss-php-sdk.git
- cd aliyun-oss-php-sdk/
- 配置好samples/Config.php #相信你肯定不是第一次用oss
- php sample/Swoole.php #運行我們提前放好的sample程序
- curl 127.0.0.1:9503
是不是出現了 Hello Swoole
這就證明swoole和oss php sdk正式搞在一起了。
設置nginx做反向代理
更普遍的做法是使用nginx作為前端代理,設置一個測試域名www.swoole.com監聽swoole起的http服務,本地設置hosts映射,就能通過域名來訪問了
具體的步驟:(已安裝nginx的自覺跳過)
- wget https://nginx.org/download/nginx-1.11.3.tar.gz #下載最新版本
- tar -zxvf nginx-1.11.3.tar.gz #解壓
- cd nginx-1.11.3
- ./configure --prefix=/usr/local/nginx #配置
- make #注意:這裏可能會報錯,提示“pcre.h No such file or directory”,具體詳見:https://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory 需要安裝 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進程:
如果是這樣說明nginx正常工作了,下麵用nginx監聽127.0.0.1:9503端口,修改 /usr/local/nginx/conf/nginx.conf如下:
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream swoole{
server 127.0.0.1:9503;
keepalive 4;
}
server {
listen 80;
server_name www.swoole.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass https://swoole;
proxy_set_header Connection "";
proxy_http_version 1.1;
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- reload nginx sudo /usr/local/nginx/sbin/nginx -s reload
vim /etc/hosts #添加
127.0.0.1 www.swoole.com
把swoole的經驗貼
- 在./aliyun-oss-php-sdk目錄下有個sample.jpg文件, 簡單上傳文件示例代碼如下,
<?php
require_once __DIR__ . '/Common.php';
use OSS\OssClient;
use OSS\Core\OssException;
$bucket = Common::getBucketName();
$ossClient = Common::getOssClient();
if (is_null($ossClient)) exit(1);
//*******************************簡單使用***************************************************************
$options = array(
OssClient::OSS_FILE_DOWNLOAD => "example_download.jpg",
);
$ossClient->uploadFile($bucket, "example.jpg", "example.jpg");
$ossClient->getObject($bucket, "example.jpg", $options);
- 執行並查看結果:
- 仿照上麵的步驟在swoole server中調用oss php sdk,並作nginx代理後,最簡單的oss上傳下載代碼變成了這樣:
<?php
require_once __DIR__ . '/Common.php';
use OSS\OssClient;
use OSS\Core\OssException;
$bucket = Common::getBucketName();
$ossClient = Common::getOssClient();
if (is_null($ossClient)) exit(1);
//*******************************簡單使用***************************************************************
$options = array(
OssClient::OSS_FILE_DOWNLOAD => "example_download.jpg",
);
$serv = new swoole_http_server("127.0.0.1", 9503);
$serv->set(array(
'worker_num' => 16,
'daemonize' => true,
'max_request' => 10000,
'dispatch_mode' => 2,
'debug_mode'=> 1,
'log_file' => '/tmp/swoole_http_server.log',
));
$serv->on('Request', function($request, $response) use($ossClient, $bucket, $options){
$ossClient->uploadFile($bucket, "example.jpg", "example.jpg");
$ossClient->getObject($bucket, "example.jpg", $options);
$response->end("Hello Swoole\n");
});
$serv->start();
- php sample/Swoole.php
- curl www.swoole.com
是不是發現長時間沒反應,nginx報個錯誤。查看nginx的accesslog,發現報504。打開我們在swoole中設置的swoole_http_server.log發現:
這裏有層問題:
- 問題一:從報錯發現是oss php sdk沒有找到這個example.jpg文件,為什麼會有這個錯誤?
- 問題二:即使有這個錯誤為什麼會造成nginx報504? 如何去解這兩個問題? 對於問題一應該是swoole的坑,實際測試發現,swoole下相對路徑是從根目錄"/"算的,而不是當前目錄。所以報文件寫成絕對路徑就ok了。 對於問題二我的理解是swoole的使用者必須去包裝它所調用的接口拋出的錯誤,對本文來說當然就是oss php sdk拋出的錯誤,以讓nginx正確識別。
最後更新:2017-05-03 21:49:06
上一篇:
分布式調用跟蹤與監控實戰
下一篇:
阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹
【北大夏令營筆記-並查集】poj1988-Cube Stacking
Memory Barriers/Fences
《Spring攻略(第2版)》——1.10 用@Required注解檢查屬性
Skype-Type:一款通過聲音竊取鍵盤記錄的Keylogger工具
ntfs掛載
分布式框架簡介SSM組合+ springmvc+mybatis+shiro+restful+bootstrap
強大的PyTorch:10分鍾讓你了解深度學習領域新流行的框架
WCF中關於可靠會話的BUG!!
javascript中encodeURI和decodeURI方法
性能測試:自建數據庫與RDS性能對比(SQL Server案例排查分析)