用Gearman分發PHP應用程序的工作負載
文章來源:PHP開發學習門戶
地址:http://www.phpthinking.com/archives/518
雖然一個 Web 應用程序的大部分內容都與表示有關,但它的價值與競爭優勢卻可能體如今若幹專有服務或算法方面。假設這類處理過於復雜或拖沓,最好是進行異步執行,以免 Web server對傳入的請求沒有響應。實際上,將一個計算密集型的或專門化的功能放在一個或多個獨立的專用server上執行。效果會更好。
經常使用的縮略詞
- API:應用程序編程接口
- HTTP:超文本傳輸協議
- LAMP:Linux、Apache、MySQL 與 PHP
PHP 的 Gearman 庫能把工作分發給一組機器。Gearman 會對作業進行排隊並少量分派作業。而將那些復雜的任務分發給為此任務預留的機器。
這個庫對 Perl、Ruby、C
、Python
及 PHP 開發者均可用。而且還能夠執行於不論什麽類似 UNIX? 的平臺上,包含 Mac OS X、 Linux? 和 Sun Solaris。
向一個 PHP 應用程序加入 Gearman 很easy。如果您將 PHP 應用程序托管在一個典型的 LAMP 配置上。那麽 Gearman 將須要一個額外的守護程序以及一個 PHP 擴展。截止到 2009 年 11 月。Gearman 守護程序的最新版本號是 0.10,而且有兩個 PHP 擴展能夠用 — 一個用 PHP 包裹了 Gearman C
庫。還有一個用純
PHP 編寫。我們要用的是前者。
請註意:對於本文而言。producer 指的是生成工作請求的機器;consumer 是運行工作的機器。而 agent 則是連接 producer 與適當 consumer 的中介。
安裝 Gearman
向一個機器加入 Gearman 須要兩步:第一步構建並啟動這個守護程序,第二步構建與 PHP 版本號相匹配的 PHP 擴展。這個守護程序包包含構建此擴展所需的全部庫。
首先,下載 Gearman 守護程序 gearmand
的最新源碼,解壓縮這個
tarball。構建並安裝此代碼(安裝須要有超級用戶的權限,即根用戶權限)。
$ wget http://launchpad.net/gearmand/trunk/ 0.10/+download/gearmand-0.10.tar.gz $ tar xvzf gearmand-0.10.tar.gz $ cd gearmand-0.10 $ ./configure $ make $ sudo make install
安裝 gearmand
後,構建 PHP 擴展。您能夠從 PECL 獲取這個
tarball,也能夠從 Github 復制該存儲庫。
$ wget http://pecl.php.net/get/gearman-0.6.0.tgz $ cd pecl-gearman # # or # $ git clone git://github.com/php/pecl-gearman.git $ cd pecl-gearman
有了這些代碼後,就能夠開始構建擴展了:
$ phpize $ ./configure $ make $ sudo make install
這個 Gearman 守護程序通常被安裝在 /usr/sbin。能夠從命令行直接啟動此守護程序,也能夠將這個守護程序加入到啟動配置中,以便在機器每次重新啟動時就能夠啟動這個守護程序。
接下來,須要安裝 Gearman 擴展。打開 php.ini 文件(能夠通過 php --ini
命令高速找到這個文件)。然後加入代碼行 extension
= gearman.so
:
$ php --ini Loaded Configuration File: /etc/php/php.ini $ vi /etc/php/php.ini ... extension = gearman.so
保存此文件。要想驗證擴展是否啟用。請執行 php --info
,然後查找
Gearman:
$ php --info | grep "gearman support" gearman gearman support => enabled libgearman version => 0.10
此外。還能夠用一個 PHP 代碼片段來驗證構建和安裝是否得當。將這個小應用程序保存到 verify_gearman.php:
<?php print gearman_version() . "\n"; ?>
接下來。從命令行執行此程序:
$ php verify_gearman.php 0.10
假設這個版本與之前構建和安裝的 Gearman 庫的版本相匹配,那麽系統就已準備好了。
執行 Gearman
我們前面提到過。一個 Gearman 配置有三個角色:
-
一個或多個 producer 生成工作請求。每一個工作請求命名它所想要的函數,比如
email_all
或analyze
。 - 一個或多個 consumer 完畢請求。每一個 consumer 命名它所提供的一個或多個函數並向 agent 註冊這些功能。一個 consumer 也能夠被稱為是一個 worker。
-
代理對與之建立連接的那些 consumer 提供的全部服務進行集中編制。
它將 producer 與恰當的 consumer 聯系起來。
借助例如以下的命令行,能夠馬上體驗 Gearman:
-
啟動這個 agent,即 Gearman 守護程序:
$ sudo /usr/sbin/gearmand --daemon
-
用命令行有用工具
gearman
執行一個 worker。這個 worker 須要一個名字並能執行不論什麽命令行有用工具。比如,能夠創建一個 worker 來列出某個文件夾的內容。
-f
參數命名了該 worker 所提供的函數:$ gearman -w -f ls -- ls -lh
-
最後的一個代碼塊是一個 producer。或用來生成查找請求的一個作業。也能夠用
gearman
生成一個請求。相同。用
-f
選項來指定想要從中獲得幫助的那個服務:$ gearman -f ls < /dev/null drwxr-xr-x@ 43 supergiantrobot staff 1.4K Nov 15 15:07 gearman-0.6.0 -rw-r--r--@ 1 supergiantrobot staff 29K Oct 1 04:44 gearman-0.6.0.tgz -rw-r--r--@ 1 supergiantrobot staff 5.8K Nov 15 15:32 gearman.html drwxr-xr-x@ 32 supergiantrobot staff 1.1K Nov 15 14:04 gearmand-0.10 -rw-r--r--@ 1 supergiantrobot staff 5.3K Jan 1 1970 package.xml drwxr-xr-x 47 supergiantrobot staff 1.6K Nov 15 14:45 pecl-gearman
從 PHP 使用 Gearman
從 PHP 使用 Gearman 類似於之前的演示樣例,惟一的差別在於這裏是在 PHP 內創建 producer 和 consumer。每一個 consumer 的工作均封裝在一個或多個 PHP 函數內。
清單 1 給出了用 PHP 編寫的一個 Gearman worker。將這些代碼保存在一個名為 worker.php 的文件裏。
清單 1. Worker.php
<?php $worker= new GearmanWorker(); $worker->addServer(); $worker->addFunction("title", "title_function"); while ($worker->work()); function title_function($job) { return ucwords(strtolower($job->workload())); } ?
>
清單 2 給出了用 PHP 編寫的一個 producer,或 client。將此代碼保存在一個名為 client.php 的文件內。
清單 2. Client.php
<?php $client= new GearmanClient(); $client->addServer(); print $client->do("title", "AlL THE World‘s a sTagE"); print "\n"; ?>
如今,能夠用例如以下的命令行連接客戶機與 worker 了:
$ php worker.php & $ php client.php All The World‘s A Stage $ jobs [3]+ Running php worker.php &
這個 worker 應用程序繼續執行,準備好服務還有一個客戶機。
Gearman 的高級特性
在一個 Web 應用程序內可能有很多地方都會用到 Gearman。能夠導入大量數據、發送很多電子郵件、編碼視頻文件、挖據數據並構建一個中央日誌設施 — 全部這些均不會影響網站的體驗和響應性。能夠並行地處理數據。
並且,因為 Gearman 協議是獨立於語言和平臺的,所以您能夠在解決方式中混合編程語言。比方,能夠用 PHP 編寫一個 producer,用 C
、Ruby
或其它不論什麽支持 Gearman 庫的語言編寫 worker。
一個連接客戶機和 worker 的 Gearman 網絡實際上可以使用不論什麽您能想象得到的結構。非常多配置可以執行多個代理並將 worker 分配到很多機器上。負載均衡是隱式的:每一個可操作的可用 worker(可能是每一個 worker 主機具有多個 worker)從隊列中拉出作業。一個作業可以同步或異步執行並具有優先級。
Gearman 的最新版本號已經將系統特性擴展到了包括持久的作業隊列和用一個新協議來通過 HTTP 提交工作請求。對於前者。Gearman 工作隊列保存在內存並在一個關系型數據庫內存有備份。這樣一來,假設 Gearman 守護程序故障,它就能夠在重新啟動後又一次創建這個工作隊列。
還有一個最新的改良通過一個 memcached 集群添加隊列持久性。memcached 存儲也依賴於內存,但被分散於幾個機器以避免單點故障。
Gearman 是一個剛剛起步卻非常有實力的工作分發系統。據 Gearman 的作者 Eric Day 介紹。Yahoo! 在 60 或很多其它的server上使用 Gearman 每天處理 600 萬個作業。
新聞聚合器 Digg 也已構建了一個同樣規模的 Gearman 網絡,每天可處理 400,000 個作業。
用Gearman分發PHP應用程序的工作負載