gearman

目录

gearman


  公司最近有一个需求,要在推广平台下载APK文件中加入我们的一些信息,然后重新签名APK文件。这个过程需要解包APK文件,加入内容,重新打包。
这些过程php都没发处理,只有调用系统的一些命令,但是出于安全和效率的考虑让php执行系统命令不是一个很好的选择,于是想到了gearman。

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等。

Job:请求的调度者,用来负责协调把Client发出的请求转发给合适的Work。

Worker:请求的处理者,可以是C,PHP,Perl等等。

安装

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \
freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel \
bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 \
krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap \
openldap-clients openldap-servers perl perl-devel libc-client-devel

yum install boost-devel
yum install gperf
yum install libuuid-devel
yum install libevent-devel

wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
tar xvf gearmand-1.1.12.tar.gz
cd gearmand-1.1.12
./configure --prefix=/usr/local/gearmand 
make
make install


启动 job server

#如果是要远程访问,要指定端口和ip
/usr/local/gearmand/sbin/gearmand -d -u root -L 118.192.89.57 -p 1324

启动 worker server

#--后面是要执行的函数,传过来的都是一行字符串
/usr/local/gearmand/bin/gearman -h 118.192.89.57 -p 1324  -w -f wc -- wc -l

启动 client server

/usr/local/gearmand/bin/gearman -h 118.192.89.57 -p 1324 -f wc < /etc/passwd

php client server 安装

#用php5.2.14安装的时候发现出现E_DEPRECATED未定义错误
#查了php5.3的更新列表,这个错误等级变量是5.3更新的所以5.2的php装不上这个扩展
#有两种办法解决这个问题
#1. 升级php到5.3版本
#2.替换php_gearman.c中的E_DEPRECATED为其他错误等级变量,比如E_ERROR

wget http://pecl.php.net/get/gearman-1.0.2.tgz
tar xvf gearman-1.0.2.tgz
cd gearman-1.0.2
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-gearman=/usr/local/gearmand/
#cp php_gearman.loT php_gearman.lo 如果编译报错,就执行这个试一下 这样好像能编译成功但是php中却没有效果
make
make install

#重启php
/usr/local/webserver/php/sbin/php-fpm restart
#看是否安装成功
/usr/local/webserver/php/bin/php --info | grep "gearman support"

php client 测试代码

<?php

$t=time();
$key="fdsffcgfg";
$p=md5($t.$key);
$client= new GearmanClient();
$client->addServer('118.192.89.57',1324);
$r=$client->doNormal('wc', $p.'|'.$t);
echo $r;

?>

测试的 worker 端代码

#!/bin/bash

read line

p=`echo $line|awk -F '|' '{print $1}'`
t=`echo $line|awk -F '|' '{print $2}'`
k="fdsffcgfg"

mk=`echo -n ${t}${k} |md5sum |awk '{print $1}'`

if [ $p = $mk ]
then
     echo 1
else
     echo 2
fi

目录