Gearman Job Worker for PHP

最近同事接觸到需要 worker 來處理一些非同步的事情。諸如訂單、寄發 email 都常用非同步來執行,以往這些事情大多都用排程解決,其實還有更好的 solution。他們使用 Gearman 來解決這個問題。好奇心的驅使,就算不是我實作的我也想去玩玩看新的東西,Gearman 可以在系統裡起一個 Job Worker 也可以算是 service,這個 job worker 可以在不起一個排程的情況底下,幫你寄信、處理訂單。也就是當你有需要使用 email 在呼叫他就好了。

安裝 Gearman

在 CentOS 中可以直接用 yum 安裝

yum install -y gearmand

安裝 Gearman 依賴包

yum -y install re2c geoip geoip-data geoip-devel gcc* boost* libgearman*

這兩個步驟都很簡單

安裝 PHP 的 Gearman extension

wget http://pecl.php.net/get/gearman-1.1.1.tgz
cd gearman-1.1.1
phpize
./configure
make && make install

最後在 php.ini 加上 module

vim /etc/php.ini
extension="gearman.so"

儲存後重新啟動

service httpd restart

這樣 php 就支援 gearman 囉

Hello World

不免俗的一定要測試一下的,這邊我就利用官網提供的程式碼做測試。

首先建立一隻 worker.php

<?php $worker= new GearmanWorker();
  $worker->addServer();
  $worker->addFunction("reverse", "my_reverse_function");
  while ($worker->work());

  function my_reverse_function($job)
  {
    return strrev($job->workload());
  }
?>

再建立一隻 client.php

<?php $client= new GearmanClient();
  $client->addServer();
  print $client->do("reverse", "Hello World!");
?>

然後執行 worker

php worker.php

再執行 client 就可以得到 Hello World 了

php client.php

若要停止這個 job worker 可以用 Ctrl + C

這東西還蠻強大的,之前試用過 Beanstalk 覺得 Gearman 相對強大許多。

Dec 22nd, 2013 4:40:00pm

Last updated