閱讀575 返回首頁    go 阿裏雲 go 技術社區[雲棲]


oss php sdk基於swoole的簡單HTTP服務器實現

前言

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

PHP的異步、並行、高性能網絡通信引擎,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,異步Redis,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole內置了Http/WebSocket服務器端/客戶端、Http2.0服務器端。
Swoole2.0支持了類似Go語言的協程,可以使用完全同步的代碼實現異步程序。PHP代碼無需額外增加任何關鍵詞,底層自動進行協程調度,實現異步。

你再看它有多牛
swoole_good

上麵的引用的都來自人民日報噢不,是官方定義,不管你信不信,反正我有點方。。。
既然它辣麼好,那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,隻要和下麵一樣我們就可以繼續玩。
swoole_grep_ok

使用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 curlswoole

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

設置nginx做反向代理

更普遍的做法是使用nginx作為前端代理,設置一個測試域名www.swoole.com監聽swoole起的http服務,本地設置hosts映射,就能通過域名來訪問了
具體的步驟:(已安裝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;
        }
}

把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);
  • 執行並查看結果:

ll_sample
這是最簡單的oss上傳下載文件用法。

  • 仿照上麵的步驟在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發現:error_nginx 這裏有層問題:
  • 問題一:從報錯發現是oss php sdk沒有找到這個example.jpg文件,為什麼會有這個錯誤?
  • 問題二:即使有這個錯誤為什麼會造成nginx報504? 如何去解這兩個問題? 對於問題一應該是swoole的坑,實際測試發現,swoole下相對路徑是從根目錄"/"算的,而不是當前目錄。所以報文件寫成絕對路徑就ok了。 對於問題二我的理解是swoole的使用者必須去包裝它所調用的接口拋出的錯誤,對本文來說當然就是oss php sdk拋出的錯誤,以讓nginx正確識別。

最後更新:2017-05-03 21:49:06

  上一篇:go 分布式調用跟蹤與監控實戰
  下一篇:go 阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹