前言:
產(chǎn)品線(xiàn)中的云服務(wù)這塊是我一人負(fù)責(zé)筏餐,目前正在起步階段,很快便遇到了第一個(gè)性能瓶頸牡拇,便是發(fā)送API請(qǐng)求時(shí)的阻塞問(wèn)題。經(jīng)常導(dǎo)致 腳本執(zhí)行超時(shí)穆律。
截止至發(fā)步時(shí)惠呼,已經(jīng)研究并部署到了實(shí)際生產(chǎn)環(huán)境中,姑且把這篇學(xué)習(xí)過(guò)程中的筆記發(fā)出來(lái)峦耘,算是簡(jiǎn)書(shū)的處女作吧剔蹋。
以下是原文。
無(wú)論是測(cè)試還是正式部署辅髓,下面文檔的應(yīng)用環(huán)境是:
CentOS 6.5 帶桌面環(huán)境泣崩。
LAMP 或 LNMP。
全程使用Root賬戶(hù)登錄
安裝與配置
-
配置LAMP或者LNMP環(huán)境洛口。
可參考這里矫付。
數(shù)據(jù)庫(kù):如果有必要可安裝 phpmyadmin 或者 navicat 作為數(shù)據(jù)庫(kù)管理工具
注意:如果使用 centos安裝時(shí)自帶的 web 服務(wù)器與 php 服務(wù)會(huì)有許多莫名其妙的問(wèn)題。建議安裝centos時(shí)不要用自帶的軟件包第焰,而是根據(jù)以上的鏈接教程配置 LAMP 或 LNMP 環(huán)境买优。
-
安裝基本 package
這步非常重要,可以決定你接下來(lái)的步驟會(huì)不會(huì)出錯(cuò)。
yum install vim wget gcc gcc-c++ make dos2unix gperf libevent libevent-devel zlib-devel bzip2-devel openssl-devel ncurses-devel boost boost-devel mysql-devel php-devel libuuid-devel
-
安裝Gearman套件杀赢。
wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz tar -zxvf gearman-1.1.12.tar.gz cd gearman-1.1.12 ./configure make make install
-
安裝php擴(kuò)展
wget http://pecl.php.net/get/gearman mv gearman gearman.tar.gz tar -zxvf gearman.tar.gz cd gearman-1.1.2/ //版本號(hào)以下載下來(lái)的為準(zhǔn) phpize ./configure make make install
修改
/etc/php.ini
,增加一行:; Enable gearman extension module extension=gearman.so
可使用
php --info | grep "gearman"
來(lái)檢測(cè)該php擴(kuò)展有沒(méi)有安裝烘跺。或者查看打印了phpinfo()
的頁(yè)面如果正確安裝的話(huà)脂崔,會(huì)得到
gearman support => enabled
的信息 -
啟動(dòng) Gearmand 守護(hù)程序
直接執(zhí)行
gearmand -d
可能會(huì)出現(xiàn)如下錯(cuò)誤:
Could not open log file "/usr/local/var/log/gearmand.log", from "/usr/sbin", switching to stderr. (No such file or directory)
解決:
mkdir -p /usr/local/var/log/ cd /usr/local/var/log/ touch gearmand.log
再次嘗試啟動(dòng):
gearmand -d
滤淳,成功運(yùn)行。可用命令
ps -ef | grep gearmand
來(lái)查看相關(guān)服務(wù)啟動(dòng)與否砌左。
使用
-
原理與名詞
名詞
-
jobserver
: 任務(wù)服務(wù)器脖咐,負(fù)責(zé)接收 任務(wù)注冊(cè)(client
),任務(wù)處理的分發(fā)調(diào)度 (worker
) -
client
: 一個(gè)client
即一次要并發(fā)處理的任務(wù)绊困。它可以指定所使用的jobserver
文搂, 決定執(zhí)行任務(wù)的方法是用同步還是用異步的方式。 -
worker
: 一個(gè)worker
即一種任務(wù)的解決方案秤朗。 它可以指定所使用的jobserver
煤蹭,跟client
所指定的jobserver
是一樣的。多個(gè)client
可以用同一個(gè)worker
取视,比如有1000封郵件的任務(wù)硝皂,即1000個(gè)client
,它們都只需要一個(gè) 處理發(fā)送郵件 的worker
.
基本原理:
-
安裝和啟動(dòng)一臺(tái)或多臺(tái)
jobserver
, 即 第一章 安裝與配置里 的 安裝gearmand套件 與 啟動(dòng)gearmand守護(hù)程序 這兩個(gè)步驟。這兩個(gè)步驟確定了一臺(tái)jobserver
的建立與使用 作谭。- 可以搞多臺(tái)服務(wù)器做并發(fā)稽物,同樣是這兩個(gè)步驟。這樣可以確保如果其中一臺(tái)
jobserver
掛掉了折欠,其余的client
與worker
不會(huì)丟失贝或。 - 記得要配置好防火墻,開(kāi)放4730端口锐秦。
- 如果這些服務(wù)器單純只是用來(lái)做
jobserver
分發(fā)的話(huà)咪奖,這些服務(wù)器不需要安裝web
服務(wù)。 - 在該文檔中酱床,無(wú)論測(cè)試還是部署暫時(shí)都只是在一臺(tái)服務(wù)器上
- 可以搞多臺(tái)服務(wù)器做并發(fā)稽物,同樣是這兩個(gè)步驟。這樣可以確保如果其中一臺(tái)
-
注冊(cè)與啟動(dòng)一個(gè)或多個(gè)
worker
:- 通過(guò)
addServer
或addServers
方法注冊(cè)到一個(gè)或多個(gè)jobserver
,然后等待分發(fā)任務(wù)(通過(guò)循環(huán))羊赵。 - 與
jobserver
一樣,也可以搞多臺(tái)服務(wù)器做并發(fā)操作扇谣。這些用作worker
的服務(wù)器昧捷,如果worker
是web服務(wù)的話(huà),需要安裝web服務(wù)罐寨,其余需要配置的與第一章雷同靡挥。
- 通過(guò)
-
注冊(cè)一個(gè)或多個(gè)
client
:- 通過(guò)
addServer
或addServers
方法注冊(cè)到一個(gè)或多個(gè)jobserver
,然后根據(jù)指定的工作方式(同步或異步)來(lái)決定反饋。 - 需要安裝
gearman
的php擴(kuò)展
- 通過(guò)
-
-
簡(jiǎn)單的測(cè)試DEMO
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())); } ?>
client.php
<?php $client= new GearmanClient(); $client->addServer(); print $client->do("title", "AlL THE World's a sTagE"); print "\n"; ?>
在網(wǎng)站根目錄創(chuàng)建這兩個(gè)文件并鍵入以上代碼衩茸。
可從命令行或者瀏覽器直接執(zhí)行這兩個(gè)文件芹血。在此例中贮泞,先啟動(dòng)
worker.php
。shell:
php worker.php
瀏覽器: 訪(fǎng)問(wèn)
localhost/worker.php
為什么呢幔烛?因?yàn)?
client.php
里用的是do
方法啃擦,是同步等待的操作,是必須等到worker
有反饋才會(huì)執(zhí)行下一步操作的饿悬。因此先啟動(dòng)
worker.php
令蛉,其開(kāi)始了一個(gè)循環(huán)不停地等待接收任務(wù)蕴纳。這個(gè)時(shí)候另開(kāi)一個(gè)窗口或者命令行 執(zhí)行client.php
,就會(huì)得到一個(gè)
worker.php
的title_function()
函數(shù)執(zhí)行后的內(nèi)容了帕涌。 -
參考來(lái)源
- http://gearman.org
- http://www.ibm.com/developerworks/cn/opensource/os-php-gearman/
- http://my.oschina.net/wakanoc/blog/101789?p=4#comments
- http://hi.baidu.com/billdkj/item/6810fceada157aabc10d752f
- http://www.ttlsa.com/gearman/gearman-mysql/
- http://blog.sina.com.cn/s/blog_5f54f0be0101btsi.html
- http://blog.sina.com.cn/s/blog_54ef398901018fog.html