Gearman是一个分发任务的程序框架,可以用在各种场合,Gearman更偏向于任务分发功能。它的任务分布非常简单,简单得可以只需要用脚本即可完成。
Gearman 分布式任务实现原理上只用到2个字段,function name 和 data。function name即任务名称,由client传给job server,
job server根据function name选择合适的worker节点来执行。data通常为执行任务所需的自定义的内容,比如简单的做法可以把需要执行的脚本当成data即可(当然要注 意其中的安全防范)。
如果有多个worker可以处理同一个function name, 则job server会自动分配一个。当用于远程监控场景时,我们可以让每个worker注册成不同的业务名称,以达到方便控制每台worker节点的目的。
#安装运行依赖 yum install -y boost boost-devel libevent libevent-devel gperf libuuid libuuid-devel #下载最新版 Gearman wget --no-check-certificate https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz ./configure make && make install mkdir -p /usr/local/var/log # 创建日志目录,否则无法启动服务# 安装PHP扩展支持 wget http://pecl.php.net/get/gearman-1.1.2.tgz #下载PHP扩展 tar zxf gearman-1.1.2.tgz cd gearman-1.1.2 phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install #修改php.ini配置文件,新增以下内容 extension=gearman.so service php-fpm restart # 重启服务 在centos下,一般文档介绍使用 gearmand -d 启动。有时可能有问题,这时可以使用命令 gearmand --log-file gearmand.log --listen 192.168.97.12 --port=4730 -d # -------------------- client.php 文件内容 ---------------------- # <?php $client= new GearmanClient(); $client->addServer('127.0.0.1', 4730); for ($i=0; $i<15; $i++) { $data = array( 'time' => date('Y-m-d H:i:s'), 'idx' => $i ); $dataString = serialize($data); $client->doBackground('jobName', $dataString); } # -------------------- worker.php 文件内容 ---------------------- # <?php $worker = new GearmanWorker(); $worker->addServer('127.0.0.1', 4730); $worker->addFunction('jobName', 'my_task'); while ($worker->work()){ if ($worker->returnCode() != GEARMAN_SUCCESS) { echo 'Something Wrong :'.$worker->returnCode(); //Gearman 状态错误 需要做日志或异常处理 } } function my_task($job) { $dataString = $job->workload(); $data = unserialize($dataString); echo var_export($data, true).PHP_EOL; sleep(3); }