Gearman的介紹
首頁在http://gearman.org/index.php, 它的主要優點有:
1. 實現了非同步計算。可以將比較耗時的計算分配到分散式運算叢集來減少站台伺服器的壓力和使用者的等待。例如passport裡的郵件發送/頭像上傳裁減/國內外資料分離請求等等。
2. 跨語言,有利於多語言多系統之間的整合。PHP/Perl/Java/C++可以融合在一起,用Perl實現的郵件發送功能PHP也能自由調用,也可以使用Perl調用另一台伺服器上用C++編寫的程式的一個函數。
3. 便於擴充和實現負載平衡。可以通過增加worker的數量來提供更好的效能,在其中一台出現問題的時候能夠由其他的worker來完成任務。
4. 開源
5. 快速: 利用了c最小化的減少了系統開銷。
Gearman的安裝配置
1.安裝Gearman server and library:
wget http://launchpad.net/gearmand/tr ... gearmand-0.8.tar.gz
tar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
make
make install
2.安裝Gearman PHP extension:
wget http://pecl.php.net/get/gearman-0.4.0.tgz
tar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
make
make install
3.編輯php.ini設定檔載入相應模組並使之生效:
extension = "gearman.so"
4.啟動Job:
gearmand -d
如果目前使用者是root的話,則需要這樣操作:
gearmand -d -u root
預設會使用4730連接埠,下面會用到。
以調試的方式啟動:
gearmand -vv
5.編寫Worker:
worker.php檔案內容如下:
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', 'my_reverse_function');
while ($worker->work());
function my_reverse_function($job)
{
return strrev($job->workload());
}
?>
設定後台運行work:
php worker.php &
6.編寫Client:
client.php檔案內容如下:
<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1', 4730);
echo $client->do('reverse', 'Hello World!'), "/n";
?>
運行client:
php client.php
輸出:!dlroW olleH
可能遇到的問題 Couldn't find uuid/uuid.h解決辦法:在新立得裡搜尋並安裝uuid-dev。 gearmand: error while loading shared libraries: libgearman.so.1: cannot open shared object file: No such file or directorylibgearman.so一般是在 /usr/local/lib下,看看/etc/ld.so.conf是否包含這個目錄,執行/sbin/ldconfig -v重新整理一下。 Fatal error: Class 'GearmanWorker' not found 是否在cli的php.ini下加入“extension="gearman.so"”這一行配置。
Gearman與Perl
安裝Gearman模組,使用Gearman::Worker和Gearman::Client模組即可。
具體編碼方式可參考cpan。
需要注意的是$client->do_task()方法返回的是一個reference。
下面是例子。worker.pluse Gearman::Worker;<br />my $worker = Gearman::Worker->new;<br />$worker->job_servers('127.0.0.1:4730');<br />$worker->register_function("reverse", /&test);<br />$worker->work while 1;</p><p>sub test {<br />return join(' ', $_[0]->handle, $_[0]->arg, 'world', "/n");<br />}<br />client.pluse Gearman::Client;<br />my $client = Gearman::Client->new;<br />$client->job_servers('127.0.0.1:4730');</p><p># running a single task<br />my $result = $client->do_task("reverse", "hello"); # return a scalar reference<br />print $$result;Gearman非同步模式的實現
在Perl的Gearman::Client模組裡已經實現了非同步方法,採用dispatch_background時client請求不會等待worker的響應就立即返回了。