標籤:
在實際工作中,會碰到兩個問題
(1)現有系統想整合一個開發組件,而該組件的SDK卻沒有現有語言版本。
(2)系統中的一項功能非常耗費資源,最好能利用其它機器來處理。
本文介紹gearman的使用,實現PHP調用JAVA。gearman是支援網路方式調用,因此也可以用來實現任務分發。
gearman的官方網站為
http://gearman.org/
,gearman系統主要分為3個部分,server、client、worker。
一、server安裝
下載 server,官方網站上提供了三個語言版本的server。http://gearman.org/download/
我們選擇C語言版本,為,https://launchpad.net/gearmand
目前提供下載的是gearmand-1.1.12.tar.gz。
在編譯之前,需要先安裝用到的庫問題,
(1)yum install boost-devel -y
(2)yum install gprep -y
(3)yum install libevent-devel -y
(4)yum install libuuid-devel -y
解壓gearmand-1.1.12,執行
./configuremakemake install
安裝完成後,在命令列運行,就可以在本地就啟動一個Job server ,等待client 和worker 串連。
gearmand -d
二、安裝PHP擴充
利用pecl安裝gearman php擴充。建議在安裝gearman server的時候採用預設安裝,這樣在安裝php 擴充的時候就比較容易找到需要的標頭檔、連結檔案。
pecl install gearman
編輯php.ini,添加
extension="gearman.so"
命令列測試 php -m |grep gearman
PHP 測試代碼
worker.php
<?php$worker= new GearmanWorker();$worker->addServer(‘127.0.0.1‘, 4730);$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(‘127.0.0.1‘, 4730);echo $client->do(‘reverse‘, ‘Hello World!‘), "\n";?>
首先運行worker.php,程式不會結束,會一直運行。
運行client,返回啟動並執行結果。
gearman提供了一個命令列偵查工具(要安裝nc)。
watch -n 1 "(echo status; sleep 0.1) | nc 127.0.0.1 4730"
,在gearman上註冊了reverse函數,worker數量為1(第3列),client 0(第1列),等待處理的請求也為0(第2列)。
三、安裝JAVA擴充
官方網站提供了兩個java擴充,java gearman server 、gearman java。筆者在用gearman java的時候,傳遞參數覺得不方便,就改用gearman server了。
下載gearman server,地址
https://github.com/gearman/java-service
maven編譯。注,筆者也沒有過maven,下面是我的操作過程
(a)下載maven ,解壓
https://maven.apache.org/download.cgi
(b)修改/etc/profile檔案,將maven/bin目錄添加到path路徑上。source /etc/profile。
mvn --vesion
進入java service 目錄執行下面的命令
mvn package
編譯的時間比較長,編譯成功後,會在源碼目錄下產生一個target目錄。注,在編譯過程中會下載很多模組,如果編譯失敗可以多試幾次。
其中 java-gearman-service-0.7.0-snapshot.jar就是需要檔案。
建立/root/workspace/gearman工程目錄,建立檔案夾 com/jfjb/gearman。建立EchoWorker.java檔案,
package com.jfjb.gearman;import org.gearman.Gearman;import org.gearman.GearmanFunction;import org.gearman.GearmanFunctionCallback;import org.gearman.GearmanServer;import org.gearman.GearmanWorker;/** * The echo worker polls jobs from a job server and execute the echo function. * * The echo worker illustrates how to setup a basic worker */public class EchoWorker implements GearmanFunction { /** The echo function name */ public static final String ECHO_FUNCTION_NAME = "echo"; /** The host address of the job server */ public static final String ECHO_HOST = "localhost"; /** The port number the job server is listening on */ public static final int ECHO_PORT = 4730; public static void main(String... args) { /* * Create a Gearman instance */ Gearman gearman = Gearman.createGearman(); /* * Create the job server object. This call creates an object represents * a remote job server. * * Parameter 1: the host address of the job server. * Parameter 2: the port number the job server is listening on. * * A job server receives jobs from clients and distributes them to * registered workers. */ GearmanServer server = gearman.createGearmanServer( EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT); /* * Create a gearman worker. The worker poll jobs from the server and * executes the corresponding GearmanFunction */ GearmanWorker worker = gearman.createGearmanWorker(); /* * Tell the worker how to perform the echo function */ worker.addFunction(EchoWorker.ECHO_FUNCTION_NAME, new EchoWorker()); /* * Tell the worker that it may communicate with the this job server */ worker.addServer(server); } @Override public byte[] work(String function, byte[] data, GearmanFunctionCallback callback) throws Exception { /* * The work method performs the gearman function. In this case, the echo * function simply returns the data it received */ return data; }}
在/root/workspace/gearman中添加需要的jar, java-gearman-service-0.7.0-snapshot.jar,slf4j-api-1.6.4.jar,slf4j-simple-1.6.4.jar。
javac -cp java-gearman-service-0.7.0-SNAPSHOT.jar com/jfjb/gearman/EchoWorker.java
運行
java -cp java-gearman-service-0.7.0-SNAPSHOT.jar:slf4j-api-1.6.4.jar:slf4j-simple-1.6.4.jar:/root/workspace/gearman3 com/jfjb/gearman/EchoWorker
此時,利用命令列查看gearman註冊的work,echo函數就是EchoWorker註冊到server上的函數。
建立一個PHP檔案clientjava.php,用來調用“echo”
<?php$client= new GearmanClient();$client->addServer(‘127.0.0.1‘, 4730);echo $client->do(‘echo‘, ‘Hello World!‘), "\n";?>
測試過程完畢。
附錄,由於作者是在一台全新系統上安裝全部軟體的。將一些設定記錄下。
一、php安裝
yum install -y php
yum install -y php-devel
二、pecl安裝
wget http://pear.php.net/go-pear.phar
php go-pear.phar
三、php後台運行
setsid php worker.php
四、jdk 安裝
rpm -ivh jdk-7u2-linux-i586.rpm
查看命令
java -version
javac -version
修改 /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_21
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar
五、eclipse安裝
下載eclipse jar檔案。
我下載的eclipse版本為eclipse-jee-luna-SR2-linux-gtk.tar.gz。
http://mirrors.opencas.cn/eclipse//technology/epp/downloads/release/luna/SR2/eclipse-jee-luna-SR2-linux-gtk.tar.gz
解壓後,控制台進入eclipse檔案夾,命令 ./eclipse啟動eclipse
gearman服務串連php java