在实际工作中,会碰到两个问题

(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,执行

  1. ./configure
  2. make
  3. make install

安装完成后,在命令行运行,就可以在本地就启动一个Job server ,等待client 和worker 连接。

  1. gearmand -d

 二、安装PHP扩展

利用pecl安装gearman php扩展。建议在安装gearman server的时候采用默认安装,这样在安装php 扩展的时候就比较容易找到需要的头文件、链接文件。

  1. pecl install gearman

编辑php.ini,添加

extension="gearman.so"

命令行测试 php -m |grep gearman

PHP 测试代码

worker.php

  1. <?php
  2. $worker= new GearmanWorker();
  3. $worker->addServer('127.0.0.1', 4730);
  4. $worker->addFunction('reverse', 'my_reverse_function');
  5. while ($worker->work());
  6. function my_reverse_function($job)
  7. {
  8. return strrev($job->workload());
  9. }
  10. ?>

client.php

  1. <?php
  2. $client= new GearmanClient();
  3. $client->addServer('127.0.0.1', 4730);
  4. echo $client->do('reverse', 'Hello World!'), "\n";
  5. ?>

首先运行worker.php,程序不会结束,会一直运行。

运行client,返回运行的结果。

gearman提供了一个命令行检测工具(要安装nc)。

  1. watch -n "(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。

  1. mvn --vesion

进入java service 目录执行下面的命令

  1. mvn package

编译的时间比较长,编译成功后,会在源码目录下生成一个target目录。注,在编译过程中会下载很多模块,如果编译失败可以多试几次。

其中 java-gearman-service-0.7.0-snapshot.jar就是需要文件。

新建/root/workspace/gearman工程目录,创建文件夹 com/jfjb/gearman。创建EchoWorker.java文件,

  1. package com.jfjb.gearman;
  2. import org.gearman.Gearman;
  3. import org.gearman.GearmanFunction;
  4. import org.gearman.GearmanFunctionCallback;
  5. import org.gearman.GearmanServer;
  6. import org.gearman.GearmanWorker;
  7.  
  8. /**
  9. * The echo worker polls jobs from a job server and execute the echo function.
  10. *
  11. * The echo worker illustrates how to setup a basic worker
  12. */
  13. public class EchoWorker implements GearmanFunction {
  14. /** The echo function name */
  15. public static final String ECHO_FUNCTION_NAME = "echo";
  16. /** The host address of the job server */
  17. public static final String ECHO_HOST = "localhost";
  18. /** The port number the job server is listening on */
  19. public static final int ECHO_PORT = 4730;
  20. public static void main(String... args) {
  21. /*
  22. * Create a Gearman instance
  23. */
  24. Gearman gearman = Gearman.createGearman();
  25. /*
  26. * Create the job server object. This call creates an object represents
  27. * a remote job server.
  28. *
  29. * Parameter 1: the host address of the job server.
  30. * Parameter 2: the port number the job server is listening on.
  31. *
  32. * A job server receives jobs from clients and distributes them to
  33. * registered workers.
  34. */
  35. GearmanServer server = gearman.createGearmanServer(
  36. EchoWorker.ECHO_HOST, EchoWorker.ECHO_PORT);
  37. /*
  38. * Create a gearman worker. The worker poll jobs from the server and
  39. * executes the corresponding GearmanFunction
  40. */
  41. GearmanWorker worker = gearman.createGearmanWorker();
  42. /*
  43. * Tell the worker how to perform the echo function
  44. */
  45. worker.addFunction(EchoWorker.ECHO_FUNCTION_NAME, new EchoWorker());
  46. /*
  47. * Tell the worker that it may communicate with the this job server
  48. */
  49. worker.addServer(server);
  50. }
  51. @Override
  52. public byte[] work(String function, byte[] data,
  53. GearmanFunctionCallback callback) throws Exception {
  54. /*
  55. * The work method performs the gearman function. In this case, the echo
  56. * function simply returns the data it received
  57. */
  58. return data;
  59. }
  60. }

在/root/workspace/gearman中添加需要的jar, java-gearman-service-0.7.0-snapshot.jar,slf4j-api-1.6.4.jar,slf4j-simple-1.6.4.jar。

  1. javac -cp java-gearman-service-0.7.-SNAPSHOT.jar com/jfjb/gearman/EchoWorker.java

运行

  1. java -cp java-gearman-service-0.7.-SNAPSHOT.jar:slf4j-api-1.6..jar:slf4j-simple-1.6..jar:/root/workspace/gearman3 com/jfjb/gearman/EchoWorker

此时,利用命令行查看gearman注册的work,echo函数就是EchoWorker注册到server上的函数。

新建一个PHP文件clientjava.php,用来调用“echo”

  1. <?php
  2. $client= new GearmanClient();
  3. $client->addServer('127.0.0.1', 4730);
  4. echo $client->do('echo', 'Hello World!'), "\n";
  5. ?>

测试过程完毕。

附录,由于作者是在一台全新系统上安装全部软件的。将一些设置记录下。

一、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的更多相关文章

  1. 【Elasticsearch】【WEB】java web服务连接es elasticsearch始终报错,无法正常连接使用的错误解决历程

    前情提要: web服务往华为云上迁移 ================内网的好环境,相关配置=================== 1.web服务关于ES的集群配置如下: elasticAddress ...

  2. 服务器启动socket服务报错 java.net.BindException:Cannot assign requested address

    错误信息:  2017-06-13 11:18:00,865 [GateServer.java:82][ERROR]:启动服务出错了java.net.BindException: Cannot ass ...

  3. PS用户配置服务连接出错

    PS用户配置服务连接出错 [2019-07-30 14:58:25.475]-[INFO ]-[xxxx.profileserver.service.ProfileServerImpl:1430][1 ...

  4. Linux下部署ASP.NET服务连接oracle遇到的问题记录

    一.如何卸载MONO Q:mono是linux系统上跨平台软件,卸载它有两种方式: 1.知道mono安装路径,安装原来的路径直接覆盖安装(最为简单): 2.不知道mono安装路径,首先通过sudo f ...

  5. ArcGIS SDE 10.1 for Postgresql 服务连接配置

    去年写了ArcGIS 10.1 如何连接Postgresql 数据库(http://blog.csdn.net/arcgis_all/article/details/8202709)当时采用的也是Ar ...

  6. idea启动服务连接mysql后 Navicat连接mysql就报错2013-Lost connection toMySQL server at

    我是使用navicat的windows端 连接centos下mysql服务器 第一次常规连接mysql正常,idea启动服务连接mysql后 Navicat连接mysql就报错2013-Lost co ...

  7. SSH服务连接

    SSH基本概述 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全. SSH服务 ssh: secure shell, protocol, 22/ ...

  8. VisualVM连接远程Java进程

    jstatd是一个RMI(Remove Method Invocation)的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具(如VisualVM)可以远程连接到本机的jvms . ...

  9. 利用VisualVM监测Azure云服务中的Java应用

    在做Java开发的时候,我们需要在上线之前对程序进行压力测试,对程序的性能进行全面的监控,了解JVM的CPU,内存,GC,classes,线程等等信息,或者在程序上线运行的过程当中以便于诊断问题或者对 ...

随机推荐

  1. mysql用一个表更新另一个表的方法

    Solution 1:  修改1列(navicate可行) update student s, city c set s.city_name = c.name where s.city_code = ...

  2. Python 常用 PEP8 编码规范和建议

    代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, va ...

  3. canvas绘制文本

    canvas绘制文本 属性和方法 font = value 设置字体 textAlign = value 设置字体对齐方式 start, end, left, right, center textBa ...

  4. C++异常处理基本句法测试

    针对C++异常机制,作如下简单测试 代码如下: #include<iostream> using namespace std; int MyDivision(int a, int b) { ...

  5. Yii中使用RBAC完全指南

    开始准备 Yii提供了强大的配置机制和很多现成的类库.在Yii中使用RBAC是很简单的,完全不需要再写RBAC代码.所以准备工作就是,打开编辑器,跟我来.设置参数.建立数据库 在配置数组中,增加以下内 ...

  6. 用VB实现COM+组件配置

    在Windwos2000的管理工具里有一个“组件服务”工具,可以实现对COM+组件的应用的安装.启动.删除和对组件的安装.删除.这在安装一个有 COM+组件的应用系统时时非常有用的,我们可以通过程序控 ...

  7. Changing the load order/delay the start of the Server service

    THE INFORMATION IN THIS ARTICLE APPLIES TO: Secure FTP Server (All Versions) EFT Server (All Version ...

  8. FORALL用法小结

    本文主要翻译.整理了ORACLE官方文档上有关FORALL的部份内容,不妥之处,还希望多和大家交流. 在发送语句到SQL引擎前,FORALL语句告知PL/SQL 引擎批挷定输入集合.尽管FORALL语 ...

  9. 使用opencv3+python实现视频运动目标检测

    本文主要实现了伯乐在线上的一个实践小项目,原文链接,用以巩固opencv视频操作知识内容.整个项目均有代码注释,通俗易懂,短短几十行就可以达到还算不错的实现效果,做起来成就感满满哒.打开编辑器,一起来 ...

  10. 【Git】二、安装配置

    一.Git安装 Linux $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ libz-dev libssl-dev $ ap ...