composer Ratchet 實驗心得

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   

簡介

Composer是PHP中用來管理依賴關係的工具。你可以在自己的項目中聲明所依賴的外部工具庫(libraries),Composer會幫你安裝這些依賴的庫檔案。

依賴管理管理

Composer不是一個包(package)管理者,當然,它處理就是包(package)和庫(libraries),你可以這樣認為Composer就是一個項目的基石,將包(package)放在一個目錄下面(例如 vendor),預設的他不會安裝任何全域的東西,他只是一個管理工具。

這個創意來自於node的npm和ruby的bundler,但是和PHP的也不是完全相同的

在PHP中composer主要要解決的幾個問題如下:

  1. 你的項目下面有許多的庫檔案

  2. 這些庫都是相互依賴存在的

  3. 這些都是你非常依賴的

  4. composer能找出你需要安裝哪個版本的包,然後在安裝它們

聲明相互的關係

假設你建立了一個項目,你需要一個庫並且記錄他們,然後你決定使用monolog。現在在我們的項目中添加一個檔案命名為composer.json,使用者描述項目的相互關係性。

composer的基本使用:

例如要載入Ratchet的相關

在項目中使用composer,require關鍵字:

檔案你需要向composer.json(項目根目錄下)檔案中加入以下代碼:

{    "require": {        "cboden/ratchet": "0.3.*"    }}

 如你所見,require的對象將會映射包的名稱(cboden/ratchet)和包的版本是1.0.*

安裝包

》composer install

關於自動載入:

為了方便的載入包檔案,Composer自動產生了一個檔案 vendor/autoload.php,你可以方便只有的使用它在任何你需要使用的地方

require ‘vendor/autoload.php‘;

 這意味著你可以非常非常方便的使用第三方代碼了,假設你的項目需要使用monlog,你直接使用吧,他們都已經自動載入了的!

當然你也可以在composer.json中載入自己的代碼:

{    "autoload": {        "psr-0": {"Acme": "src/"}    }}

 

composer將會把psr-0註冊為Acme的命名空間

你可以定義一個映射通過命名空間到檔案目錄,src目錄是你的根目錄,vendor是同一層級的目錄,例如一個檔案為:src/Acme/Foo.php就包含了Acme\Foo類

當你在增加autoload之後,你必須要重新install來產生vendor/autoload.php檔案

在我們引用此檔案的時候,將會返回一個autoloader類的實力,所以你可以把返回的值放入一個變數,然後在增加更多的命名空間,如果在開發環境下這是非常方便的,例如:

$loader = require ‘vendor/autoload.php‘;$loader->add(‘Acme\Test‘, __DIR__);

 ------------------------------------------------------分割線 上面是介紹composer的作用,因為Ratchat類的載入要靠它簡化--------------------------------------------------------------

下面介紹搭建Ratchet過程(我是在windows 7下搭建的)

1、建立項目根目錄

根目錄下建立composer.json:

{    "require": {        "cboden/ratchet": "0.3.*"    }}

 2、在根目錄下執行dos命令:

》composer install

 3、建立自己的MyApp檔案。在建立之前你需要建立命名空間要修改composer.json:

{    "autoload": {        "psr-0": {            "MyApp": "src"        }    },    "require": {        "cboden/ratchet": "0.3.*"    }}

 install:

>>composer install

 4、建立自己的聊天室應用類,這個類會監聽4個事件:關閉、發送訊息、開啟、出錯。類的代碼如下(這個類待會還要修改):

<?phpnamespace MyApp;use Ratchet\MessageComponentInterface;use Ratchet\ConnectionInterface;class Chat implements MessageComponentInterface {    public function onOpen(ConnectionInterface $conn) {    }    public function onMessage(ConnectionInterface $from, $msg) {    }    public function onClose(ConnectionInterface $conn) {    }    public function onError(ConnectionInterface $conn, \Exception $e) {    }}

 儲存為:/src/MyApp/Chat.php

5、建立一個運行socket服務的類:

<?phpuse Ratchet\Server\IoServer;use MyApp\Chat;    require dirname(__DIR__) . ‘/vendor/autoload.php‘;    $server = IoServer::factory(        new Chat(),        8080    );    $server->run();

 儲存為: /bin/chat-server.php

dos下執行這個指令碼開啟服務:

php bin/chat-server.php

 6、現在為止,我們的伺服器通過指令碼開啟了,聊天類也執行了,現在需要向聊天類中加代碼:

<?phpnamespace MyApp;use Ratchet\MessageComponentInterface;use Ratchet\ConnectionInterface;class Chat implements MessageComponentInterface {    protected $clients;    public function __construct() {        $this->clients = new \SplObjectStorage;    }    public function onOpen(ConnectionInterface $conn) {        // Store the new connection to send messages to later        $this->clients->attach($conn);        echo "New connection! ({$conn->resourceId})\n";    }    public function onMessage(ConnectionInterface $from, $msg) {        $numRecv = count($this->clients) - 1;        echo sprintf(‘Connection %d sending message "%s" to %d other connection%s‘ . "\n"            , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? ‘‘ : ‘s‘);        foreach ($this->clients as $client) {            if ($from !== $client) {                // The sender is not the receiver, send to each client connected                $client->send($msg);            }        }    }    public function onClose(ConnectionInterface $conn) {        // The connection is closed, remove it, as we can no longer send it messages        $this->clients->detach($conn);        echo "Connection {$conn->resourceId} has disconnected\n";    }    public function onError(ConnectionInterface $conn, \Exception $e) {        echo "An error has occurred: {$e->getMessage()}\n";        $conn->close();    }}

 7、通過win dos 視窗做實驗需要開啟三個終端分別運行:

》》php bin/chat-server.php

 

》》telnet localhost 8080
telnet localhost 8080

 在每個終端中列印Hellow world,另一個終端也會出現!

8、到現在我們已經在終端實驗成功了,下一步是怎麼在瀏覽器中實驗。還是要修改聊天類:

<?phpuse Ratchet\Server\IoServer;use Ratchet\Http\HttpServer;use Ratchet\WebSocket\WsServer;use MyApp\Chat;    require dirname(__DIR__) . ‘/vendor/autoload.php‘;    $server = IoServer::factory(        new HttpServer(            new WsServer(                new Chat()            )        ),        8080    );    $server->run();

 dos下執行這個類 php ./bin/chat-server.php

9、開啟幾個瀏覽器做實驗。使用console執行下面的js代碼:

var conn = new WebSocket(‘ws://localhost:8080‘);conn.onopen = function(e) {    console.log("Connection established!");};conn.onmessage = function(e) {    console.log(e.data);};

 當你看到 "Connection established!"的時候說明你已經串連成功了,這時候你可以向另外的瀏覽器發送訊息了!

conn.send(‘Hello World!‘);

 試一下!你會成功的!我用的是三個瀏覽器做實驗,結果如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.