併發利器 Gearman (一) 嘗試

PHP 沒有提供直接的併發功能。要實現併發,必須:php

function asyn_send(){bootstrap

$fp = fsockopen('localhost', 80, &$errno, &$errstr, 5);併發

if(!$fp){函數

echo "$errstr ($errno)
/n";ui

}spa

fputs($fp, "GET /sync.php?param=1&param2=2&a=c/r/n");.net

fclose($fp);命令行

}代理

要否則, PHP 會逐條代碼執行,上一條執行完成後纔會執行下一條。而上面這種方式處理擴展性不夠強。orm

PHP 的 Gearman 庫能把工做分發給一組機器。Gearman 會對做業進行排隊並少許分派做業,而將那些複雜的任務分發給爲此任務預留的機器。

這個庫對 Perl、Ruby、C、Python 及 PHP 開發人員都可用,而且還能夠運行於任何相似 UNIX® 的平臺上,包括 Mac OS X、 Linux® 和 Sun Solaris。

向一個 PHP 應用程序添加 Gearman 很是簡單。咱們是將 PHP 應用程序託管在一個典型的 LAMP 配置上,那麼 Gearman 將須要一個額外的守護程序以及一個 PHP 擴展。

安裝 Gearman

======================

向一個機器添加 Gearman 須要兩步:

1.構建並啓動這個守護程序

2.構建與 PHP 版本相匹配的 PHP 擴展。

守護程序

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

這個守護程序包包括構建此擴展所需的全部庫。

首先,下載 Gearman 守護程序 gearmand 的最新源代碼,解壓縮這個 tarball,構建並安裝此代碼(安裝須要有超級用戶的權限,即根用戶權限)。

下載頁面是:https://launchpad.net/gearmand/

wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz

tar -zxf gearmand-1.1.5.tar.gz

cd gearmand-1.1.5

./configure

這時報錯:

checking whether build environment is sane... configure: error: newly created file is older than distributed files!

原來是系統時間不對.從新設置一下時間

設置好後又報錯:

cannot find Boost headers version

這是由於boost的版本低於 1.37.0,須要安裝超過1.37.0的boost庫

能夠去下載新一點的boost庫,下載地址爲

http://sourceforge.net/projects/boost/files/boost/1.53.0/

wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz/download

下載完畢後,解壓縮包

tar -zxf boost_1_44_0.tar.gz

而後進入目錄boost_1_44_0執行

./bootstrap.sh --prefix=/usr/local/boost

生成bjam之後,再執行

./bjam install

執行軟連接

ln -s /usr/local/boost/include/boost/ /usr/local/include/boost

ln -s /usr/local/boost/lib/libboost_program_options.so  /usr/lib/libboost_program_options.so

ln -s /usr/local/boost/lib/libboost_program_options.so.1.53.0 /usr/lib/libboost_program_options.so.1.53.0 

回到gearmand-1.1.5目錄

make

make install

PHP 擴展

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

安裝 gearmand 後,構建 PHP 擴展。從 PECL 獲取這個 tarball,也能夠從 Github 複製該存儲庫。

wget http://pecl.php.net/get/gearman-1.1.1.tgz

tar -zxf gearman-1.1.1.tgz

cd gearman-1.1.1

有了這些代碼後,就能夠開始構建擴展了:

phpize

./configure --with-php-config=/usr/local/php/bin/php-config 

make

make install

這個 Gearman 守護程序一般被安裝在 /usr/local/sbin。

能夠從命令行直接啓動此守護程序,也能夠將這個守護程序添加到啓動配置中,以便在機器每次重啓時就能夠啓動這個守護程序。

接下來,須要安裝 Gearman 擴展。

打開 php.ini 文件(個人在:/usr/local/php/etc/php.ini 能夠經過:find / -type f -name php.ini 查找),而後添加代碼行 extension = gearman.so:

vi /usr/local/php/etc/php.ini

...

extension = gearman.so

保存此文件。要想驗證擴展是否啓用,請運行 php --info,而後查找 Gearman:

php --info | grep "gearman support"

獲得結果:

gearman support => enabled

此外,還能夠用一個 PHP 代碼片斷來驗證構建和安裝是否得當。將這個小應用程序保存到 verify_gearman.php:

<?php

  print gearman_version() . "\n";

?>

接下來,從命令行運行此程序:

$ php verify_gearman.php

1.1.5

若是這個版本號與以前構建和安裝的 Gearman 庫的版本號相匹配,那麼系統就已準備好了。

運行 Gearman

======================

一個 Gearman 配置有三個角色:

一個或多個 producer 生成工做請求。每一個工做請求命名它所想要的函數,例如 email_all 或 analyze。

一個或多個 consumer 完成請求。每一個 consumer 命名它所提供的一個或多個函數並向 agent 註冊這些功能。

一個 consumer 也能夠被稱爲是一個 worker。

代理對與之創建鏈接的那些 consumer 提供的全部服務進行集中編制。它將 producer 與恰當的 consumer 聯繫起來。

藉助以下的命令行,能夠當即體驗 Gearman:

啓動這個 agent,即 Gearman 守護程序:

/usr/local/sbin/gearmand --daemon

報錯: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

再次嘗試啓動:

/usr/local/sbin/gearmand --daemon

成功運行.查看進程:ps -ef | grep gearmand

root     19390     1  0 17:50 ?        00:00:00 gearmand --daemon

root     19403     1  0 17:54 ?        00:00:00 /usr/local/sbin/gearmand --daemon

root     19406  1556  0 17:54 pts/3    00:00:00 grep gearmand

從 PHP 使用 Gearman

======================

從 PHP 使用 Gearman 相似於以前的示例,唯一的區別在於這裏是在 PHP 內建立 producer 和 consumer。

每一個 consumer 的工做均封裝在一個或多個 PHP 函數內。

先用 PHP 編寫的一個 Gearman worker。將這些代碼保存在一個名爲 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()));

  }

?>

再用 PHP 編寫的一個 producer,或 client。將此代碼保存在一個名爲 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

相關文章
相關標籤/搜索