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¶m2=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