服務(wù)項(xiàng)目:網(wǎng)站建設(shè)、仿站、程序開發(fā)、APP開發(fā)設(shè)計(jì)、移動網(wǎng)站開發(fā)設(shè)計(jì)、企業(yè)網(wǎng)站設(shè)計(jì)、電子商務(wù)網(wǎng)站開發(fā)、網(wǎng)站維護(hù)、網(wǎng)站推廣、UX/UI 、HTML5、CSS3、JS / Jquery ...
四川???萍加邢薰?></a></div>
                    <div   id=四川???萍加邢薰? title=
四川???萍加邢薰?(開發(fā)設(shè)計(jì)官網(wǎng))TEL : 15308000360 / QQ : 38585404

您的位置:首頁 > 技術(shù)經(jīng)驗(yàn) > 編程開發(fā) > 正文

用Gearman分發(fā)PHP應(yīng)用程序的工作負(fù)載
技術(shù)支持服務(wù)電話:15308000360 【7x24提供運(yùn)維服務(wù),解決各類系統(tǒng)/軟硬件疑難技術(shù)問題】

盡管一個 Web 應(yīng)用程序的大部分內(nèi)容都與表示有關(guān),但它的價(jià)值與競爭優(yōu)勢卻可能體現(xiàn)在若干專有服務(wù)或算法方面。如果這類處理過于復(fù)雜或拖沓,最好是進(jìn)行異步執(zhí)行,以免 Web 服務(wù)器對傳入的請求沒有響應(yīng)。實(shí)際上,將一個計(jì)算密集型的或?qū)iT化的功能放在一個或多個獨(dú)立的專用服務(wù)器上運(yùn)行,效果會更好。

常用的縮略詞

  • API:應(yīng)用程序編程接口
  • HTTP:超文本傳輸協(xié)議
  • LAMP:Linux、Apache、MySQL 與 PHP

PHP 的 Gearman 庫能把工作分發(fā)給一組機(jī)器。Gearman 會對作業(yè)進(jìn)行排隊(duì)并少量分派作業(yè),而將那些復(fù)雜的任務(wù)分發(fā)給為此任務(wù)預(yù)留的機(jī)器。這個庫對 Perl、Ruby、C、Python 及 PHP 開發(fā)人員均可用,并且還可以運(yùn)行于任何類似 UNIX® 的平臺上,包括 Mac OS X、 Linux® 和 Sun Solaris。

向一個 PHP 應(yīng)用程序添加 Gearman 非常簡單。假設(shè)您將 PHP 應(yīng)用程序托管在一個典型的 LAMP 配置上,那么 Gearman 將需要一個額外的守護(hù)程序以及一個 PHP 擴(kuò)展。截止到 2009 年 11 月,Gearman 守護(hù)程序的最新版本是 0.10,并且有兩個 PHP 擴(kuò)展可以用 — 一個用 PHP 包裹了 Gearman C 庫,另一個用純 PHP 編寫。我們要用的是前者。

請注意:對于本文而言,producer 指的是生成工作請求的機(jī)器;consumer 是執(zhí)行工作的機(jī)器;而 agent 則是連接 producer 與適當(dāng) consumer 的中介。

安裝 Gearman

向一個機(jī)器添加 Gearman 需要兩步:第一步構(gòu)建并啟動這個守護(hù)程序,第二步構(gòu)建與 PHP 版本相匹配的 PHP 擴(kuò)展。這個守護(hù)程序包包括構(gòu)建此擴(kuò)展所需的所有庫。

首先,下載 Gearman 守護(hù)程序 gearmand 的最新源代碼,解壓縮這個 tarball,構(gòu)建并安裝此代碼(安裝需要有超級用戶的權(quán)限,即根用戶權(quán)限)。

$ 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 后,構(gòu)建 PHP 擴(kuò)展。您可以從 PECL 獲取這個 tarball,也可以從 Github 復(fù)制該存儲庫。

$ 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

有了這些代碼后,就可以開始構(gòu)建擴(kuò)展了:

$ phpize
$ ./configure
$ make
$ sudo make install

這個 Gearman 守護(hù)程序通常被安裝在 /usr/sbin??梢詮拿钚兄苯訂哟耸刈o(hù)程序,也可以將這個守護(hù)程序添加到啟動配置中,以便在機(jī)器每次重啟時就可以啟動這個守護(hù)程序。

接下來,需要安裝 Gearman 擴(kuò)展。打開 php.ini 文件(可以通過 php --ini 命令快速找到這個文件),然后添加代碼行 extension = gearman.so:

$ php --ini
Loaded Configuration File:         /etc/php/php.ini
$ vi /etc/php/php.ini 
...
extension = gearman.so

保存此文件。要想驗(yàn)證擴(kuò)展是否啟用,請運(yùn)行 php --info,然后查找 Gearman:

$ php --info | grep "gearman support"
gearman
gearman support => enabled
libgearman version => 0.10

此外,還可以用一個 PHP 代碼片段來驗(yàn)證構(gòu)建和安裝是否得當(dāng)。將這個小應(yīng)用程序保存到 verify_gearman.php:

接下來,從命令行運(yùn)行此程序:

$ php verify_gearman.php
0.10

如果這個版本號與之前構(gòu)建和安裝的 Gearman 庫的版本號相匹配,那么系統(tǒng)就已準(zhǔn)備好了。

 

 

運(yùn)行 Gearman

我們前面提到過,一個 Gearman 配置有三個角色:

  • 一個或多個 producer 生成工作請求。每個工作請求命名它所想要的函數(shù),例如 email_all 或 analyze。
  • 一個或多個 consumer 完成請求。每個 consumer 命名它所提供的一個或多個函數(shù)并向 agent 注冊這些功能。一個 consumer 也可以被稱為是一個 worker。
  • 代理對與之建立連接的那些 consumer 提供的所有服務(wù)進(jìn)行集中編制。它將 producer 與恰當(dāng)?shù)?consumer 聯(lián)系起來。

借助如下的命令行,可以立即體驗(yàn) Gearman:

  1. 啟動這個 agent,即 Gearman 守護(hù)程序:
    $ sudo /usr/sbin/gearmand --daemon
  2. 用命令行實(shí)用工具 gearman 運(yùn)行一個 worker。這個 worker 需要一個名字并能運(yùn)行任何命令行實(shí)用工具。例如,可以創(chuàng)建一個 worker 來列出某個目錄的內(nèi)容。-f 參數(shù)命名了該 worker 所提供的函數(shù):
    $ gearman -w -f ls -- ls -lh
  3. 最后的一個代碼塊是一個 producer,或用來生成查找請求的一個作業(yè)。也可以用 gearman 生成一個請求。同樣,用 -f 選項(xiàng)來指定想要從中獲得幫助的那個服務(wù):
    $ 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 類似于之前的示例,惟一的區(qū)別在于這里是在 PHP 內(nèi)創(chuàng)建 producer 和 consumer。每個 consumer 的工作均封裝在一個或多個 PHP 函數(shù)內(nèi)。

清單 1 給出了用 PHP 編寫的一個 Gearman worker。將這些代碼保存在一個名為 worker.php 的文件中。

清單 1. Worker.php
addServer();
  $worker->addFunction("title", "title_function");
  while ($worker->work());
   
  function title_function($job)
  {
    return ucwords(strtolower($job->workload()));
  }
?>

清單 2 給出了用 PHP 編寫的一個 producer,或 client。將此代碼保存在一個名為 client.php 的文件內(nèi)。

清單 2. Client.php
addServer();
  print $client->do("title", "AlL THE World's a sTagE");
  print "\n";
?>

現(xiàn)在,可以用如下的命令行連接客戶機(jī)與 worker 了:

$ php worker.php &
$ php client.php
All The World's A Stage
$ jobs
[3]+  Running                 php worker.php &

這個 worker 應(yīng)用程序繼續(xù)運(yùn)行,準(zhǔn)備好服務(wù)另一個客戶機(jī)。

 

 

Gearman 的高級特性

在一個 Web 應(yīng)用程序內(nèi)可能有許多地方都會用到 Gearman??梢詫?dǎo)入大量數(shù)據(jù)、發(fā)送許多電子郵件、編碼視頻文件、挖據(jù)數(shù)據(jù)并構(gòu)建一個中央日志設(shè)施 — 所有這些均不會影響站點(diǎn)的體驗(yàn)和響應(yīng)性??梢圆⑿械靥幚頂?shù)據(jù)。而且,由于 Gearman 協(xié)議是獨(dú)立于語言和平臺的,所以您可以在解決方案中混合編程語言。比如,可以用 PHP 編寫一個 producer,用 C、Ruby 或其他任何支持 Gearman 庫的語言編寫 worker。

一個連接客戶機(jī)和 worker 的 Gearman 網(wǎng)絡(luò)實(shí)際上可以使用任何您能想象得到的結(jié)構(gòu)。很多配置能夠運(yùn)行多個代理并將 worker 分配到許多機(jī)器上。負(fù)載均衡是隱式的:每個可操作的可用 worker(可能是每個 worker 主機(jī)具有多個 worker)從隊(duì)列中拉出作業(yè)。一個作業(yè)能夠同步或異步運(yùn)行并具有優(yōu)先級。

Gearman 的最新版本已經(jīng)將系統(tǒng)特性擴(kuò)展到了包含持久的作業(yè)隊(duì)列和用一個新協(xié)議來通過 HTTP 提交工作請求。對于前者,Gearman 工作隊(duì)列保存在內(nèi)存并在一個關(guān)系型數(shù)據(jù)庫內(nèi)存有備份。這樣一來,如果 Gearman 守護(hù)程序故障,它就可以在重啟后重新創(chuàng)建這個工作隊(duì)列。另一個最新的改良通過一個 memcached 集群增加隊(duì)列持久性。memcached 存儲也依賴于內(nèi)存,但被分散于幾個機(jī)器以避免單點(diǎn)故障。

Gearman 是一個剛剛起步卻很有實(shí)力的工作分發(fā)系統(tǒng)。據(jù) Gearman 的作者 Eric Day 介紹,Yahoo! 在 60 或更多的服務(wù)器上使用 Gearman 每天處理 600 萬個作業(yè)。新聞聚合器 Digg 也已構(gòu)建了一個相同規(guī)模的 Gearman 網(wǎng)絡(luò),每天可處理 400,000 個作業(yè)。



上一篇:PHP生成各種隨機(jī)驗(yàn)證碼[實(shí)例代碼]
下一篇:PHP的curl庫代碼使用詳解

相關(guān)熱詞搜索:gearman php