用 Gearman 分发 PHP 应用程序的工作负载
盡管一個 Web 應用程序的大部分內容都與表示有關,但它的價值與競爭優勢卻可能體現在若干專有服務或算法方面。如果這類處理過于復雜或拖沓,最好是進行異步執行,以免 Web 服務器對傳入的請求沒有響應。實際上,將一個計算密集型的或專門化的功能放在一個或多個獨立的專用服務器上運行,效果會更好。
常用的縮略詞
- API:應用程序編程接口
- HTTP:超文本傳輸協議
- LAMP:Linux、Apache、MySQL 與 PHP
PHP 的 Gearman 庫能把工作分發給一組機器。Gearman 會對作業進行排隊并少量分派作業,而將那些復雜的任務分發給為此任務預留的機器。這個庫對 Perl、Ruby、C、Python 及 PHP 開發人員均可用,并且還可以運行于任何類似 UNIX? 的平臺上,包括 Mac OS X、 Linux? 和 Sun Solaris。
向一個 PHP 應用程序添加 Gearman 非常簡單。假設您將 PHP 應用程序托管在一個典型的 LAMP 配置上,那么 Gearman 將需要一個額外的守護程序以及一個 PHP 擴展。截止到 2009 年 11 月,Gearman 守護程序的最新版本是 0.10,并且有兩個 PHP 擴展可以用 — 一個用 PHP 包裹了 Gearman?C?庫,另一個用純 PHP 編寫。我們要用的是前者。它的最新版本是 0.6.0,可以從 PECL 或 Github(參見?參考資料)獲取它的源代碼。
請注意:對于本文而言,producer?指的是生成工作請求的機器;consumer?是執行工作的機器;而?agent?則是連接 producer 與適當 consumer 的中介。
安裝 Gearman
向一個機器添加 Gearman 需要兩步:第一步構建并啟動這個守護程序,第二步構建與 PHP 版本相匹配的 PHP 擴展。這個守護程序包包括構建此擴展所需的所有庫。
首先,下載 Gearman 守護程序?gearmand?的最新源代碼,解壓縮這個 tarball,構建并安裝此代碼(安裝需要有超級用戶的權限,即根用戶權限)。
| 1 2 3 4 5 6 7 | $ 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 復制該存儲庫。
| 1 2 3 4 5 6 7 | $ 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 |
有了這些代碼后,就可以開始構建擴展了:
| 1 2 3 4 | $ phpize $ ./configure $ make $ sudo make install |
這個 Gearman 守護程序通常被安裝在 /usr/sbin。可以從命令行直接啟動此守護程序,也可以將這個守護程序添加到啟動配置中,以便在機器每次重啟時就可以啟動這個守護程序。
接下來,需要安裝 Gearman 擴展。打開 php.ini 文件(可以通過?php --ini?命令快速找到這個文件),然后添加代碼行?extension = gearman.so:
| 1 2 3 4 5 | $ php --ini Loaded Configuration File:???????? /etc/php/php.ini $ vi /etc/php/php.ini ... extension = gearman.so |
保存此文件。要想驗證擴展是否啟用,請運行?php --info,然后查找 Gearman:
| 1 2 3 4 | $ php --info | grep "gearman support" gearman gearman support => enabled libgearman version => 0.10 |
此外,還可以用一個 PHP 代碼片段來驗證構建和安裝是否得當。將這個小應用程序保存到 verify_gearman.php:
| 1 2 3 | <?php ??print gearman_version() . "\n"; ?> |
接下來,從命令行運行此程序:
| 1 2 | $ php verify_gearman.php 0.10 |
如果這個版本號與之前構建和安裝的 Gearman 庫的版本號相匹配,那么系統就已準備好了。
運行 Gearman
我們前面提到過,一個 Gearman 配置有三個角色:
- 一個或多個 producer 生成工作請求。每個工作請求命名它所想要的函數,例如?email_all?或?analyze。
- 一個或多個 consumer 完成請求。每個 consumer 命名它所提供的一個或多個函數并向 agent 注冊這些功能。一個 consumer 也可以被稱為是一個?worker。
- 代理對與之建立連接的那些 consumer 提供的所有服務進行集中編制。它將 producer 與恰當的 consumer 聯系起來。
借助如下的命令行,可以立即體驗 Gearman:
| 1 | $ sudo /usr/sbin/gearmand --daemon |
| 1 | $ gearman -w -f ls -- ls -lh |
| 1 2 3 4 5 6 7 | $ 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
| 1 2 3 4 5 6 7 8 9 10 11 | <?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
| 1 2 3 4 5 6 | <?php ??$client= new GearmanClient(); ??$client->addServer(); ??print $client->do("title", "AlL THE World's a sTagE"); ??print "\n"; ?> |
現在,可以用如下的命令行連接客戶機與 worker 了:
| 1 2 3 4 5 | $ 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 或更多的服務器上使用 Gearman 每天處理 600 萬個作業。新聞聚合器 Digg 也已構建了一個相同規模的 Gearman 網絡,每天可處理 400,000 個作業。Gearman 的一個出色例子可以在 Narada 這個開源搜索引擎(參見?參考資料)中找到。
Gearman 的未來版本將收集并報告統計數據、提供高級監視和緩存作業結果等。為了跟蹤這個 Gearman 項目,可以訂閱它的 Google 組,或訪問 Freenode 上它的 IRC 頻道?#gearman。
相關主題
- 利用?Gearman?站點,了解有關此庫的更多信息。
- Narada 搜索引擎?是一個開源項目,強調了最新開源技術(包括 Gearman)的使用。
- 查閱?Gearman 下載?和擴展,包括針對?C?庫的 PHP 擴展。
- PHP.net?是面向 PHP 開發人員的中心資源。
- 查閱 “推薦 PHP 讀物列表”。
- 查看 IBM developerWorks 的?PHP 項目資源,擴展您的 PHP 技巧。
- 要將數據庫與 PHP 結合使用?查看?Zend Core for IBM,它是一個無縫的、可以立即使用、易于安裝、支持 IBM DB2 V9 的 PHP 開發和生產環境。
- 隨時關注 developerWorks?技術活動和網絡廣播。
- 訪問 developerWorks?Open source 專區?獲得豐富的 how-to 信息、工具和項目更新以及?最受歡迎的文章和教程,幫助您用開放源碼技術進行開發,并將它們與 IBM 產品結合使用。
- 下載?IBM 產品評估試用版軟件?或?IBM SOA Sandbox for Reuse,并開始使用來自 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 的應用程序開發工具和中間件產品。
總結
以上是生活随笔為你收集整理的用 Gearman 分发 PHP 应用程序的工作负载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gearman的安装与使用示例
- 下一篇: curl常用功能