標籤:style blog http color 使用 strong
簡介
Composer是PHP中用來管理依賴關係的工具。你可以在自己的項目中聲明所依賴的外部工具庫(libraries),Composer會幫你安裝這些依賴的庫檔案。
依賴管理管理
Composer不是一個包(package)管理者,當然,它處理就是包(package)和庫(libraries),你可以這樣認為Composer就是一個項目的基石,將包(package)放在一個目錄下面(例如 vendor),預設的他不會安裝任何全域的東西,他只是一個管理工具。
這個創意來自於node的npm和ruby的bundler,但是和PHP的也不是完全相同的
在PHP中composer主要要解決的幾個問題如下:
你的項目下面有許多的庫檔案
這些庫都是相互依賴存在的
這些都是你非常依賴的
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!‘);
試一下!你會成功的!我用的是三個瀏覽器做實驗,結果如下: