Gearman + PHP 实现分布式对象调用

Gearman + PHP 实现分布式对象调用

http://netkiller.github.io/journal/gearman.php.html

Mr. Neo Chen (netkiller), 陈景峰(BG7NYT)

中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080
<netkiller@msn.com>

$Id$

版权 2011, 2012, 2013 http://netkiller.github.io

$Date$

摘要

在群里看到有网友问,IDC的服务器是否需要开启防火墙,我意识到应该写一篇关于IDC安全的文章。

我的系列文档

Netkiller Architect 手札 Netkiller Developer 手札 Netkiller PHP 手札 Netkiller Python 手札 Netkiller Testing 手札 Netkiller Cryptography 手札
Netkiller Linux 手札 Netkiller CentOS 手札 Netkiller FreeBSD 手札 Netkiller Security 手札 Netkiller Version 手札 Netkiller Web 手札
Netkiller Monitoring 手札 Netkiller Storage 手札 Netkiller Mail 手札 Netkiller Shell 手札 Netkiller Network 手札 Netkiller Database 手札
Netkiller PostgreSQL 手札 Netkiller MySQL 手札 Netkiller NoSQL 手札 Netkiller LDAP 手札 Netkiller Cisco IOS 手札 Netkiller H3C 手札
Netkiller Multimedia 手札 Netkiller Docbook 手札 Netkiller 开源软件 手札  

 

目录

1. Gearman Job Server2. Gearman PHP扩展3. 参数传递与返回值

1. Gearman Job Server

文本格式回复

yum install gearmand
		

2. Gearman PHP扩展

PHP扩展安装

#!/bin/bash

yum install libgearman-devel -y
pecl install gearman

cat >> /srv/php/etc/conf.d/gearman.ini <<EOF
extension=gearman.so
EOF

确认模块是否安装,同时检查gearman扩展的版本。

# php -m | grep gearman
gearman

# php -r 'printf("%s\r\n",gearman_version());'
1.1.8
		

测试脚本 server.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->doNormal("reverse", "Hello World!");
?>

我用'o' 表示与上次备份中有差异的部分。

 

3. 参数传递与返回值

Gearman 向functon 传递参数只能通过$job->workload(), 而 $job->workload() 只能传递字符串。

如果托传递多个参数,需要将参数序列化后传递

返回值也一样,一个字符串可以直接返回,如果返回数字类型是不允许的,需要序列化处理

例 1. 多参数传递与返回值实例

Server

<?php
require 'Doctrine/Common/ClassLoader.php';

use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Configuration;

$classLoader = new ClassLoader('Doctrine', '/www/DoctrineDBAL-2.3.4/');
$classLoader->register();

$config = new Configuration();

$connectionParams = array(
    'dbname' => 'example',
    'user' => 'www',
    'password' => 'password',
    'host' => '192.168.2.1',
    'driver' => 'pdo_mysql',
);
$conn = DriverManager::getConnection($connectionParams, $config);

$host = '127.0.0.1';
$port = 4730;

echo "Starting\n";

# Create our worker object.
$gmworker= new GearmanWorker();

# Add default server (localhost).
$gmworker->addServer($host, $port);

# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$gmworker->addFunction("members", "members");

print "Waiting for job...\n";
while($gmworker->work())
{
  if ($gmworker->returnCode() != GEARMAN_SUCCESS)
  {
    echo "return_code: " . $gmworker->returnCode() . "\n";
    break;
  }
}

function members($job)
{
	global  $conn;
	$param = unserialize($job->workload());
	print_r($param);
	$sql = "SELECT username FROM members limit ".$param['limit'].",".$param['offset'];
	$stmt = $conn->query($sql);

	while ($row = $stmt->fetch()) {
		//printf("%s\r\n", );
		$result[] = $row['username'];
	}
	return serialize($result);
}

Client

<?php

# create our client object
$gmclient= new GearmanClient();

# add the default server (localhost)
$gmclient->addServer();

# run reverse client in the background
$job_handle = $gmclient->doNormal("members",serialize(array('limit'=>5,'offset'=>10)));

if ($gmclient->returnCode() == GEARMAN_SUCCESS)
{
	print_r(unserialize($job_handle));
}		

运行结果

$ php client.php
Array
(
    [0] => 257000005
    [1] => 257000006
    [2] => 257000009
    [3] => 257000010
    [4] => 257000011
    [5] => 257000012
    [6] => 257000013
    [7] => 257000014
    [8] => 257000015
    [9] => 257000016
)
时间: 2024-09-14 19:45:19

Gearman + PHP 实现分布式对象调用的相关文章

分布式对象和远程调用

一.引言 1.1 分布式对象技术要解决的基本问题 分布式对象技术是在面向对象技术的基础上发展起来的,它要解决的主要问题是位于不同进程中的对象之间的调用问题. 支持访问异地对象,支持访问异构对象(java平台调用C.vb,C++). 1.2 中间件 参考http://kb.cnblogs.com/page/196448/  1.中间件是一种软件,它提供基本的通信模块和其他一些基础服务模块,使得应用程序开发提供平台. 中间件技术提供了一个编程的抽象,来屏蔽上述的异质问题. 通信协议:独立于网络底层的

ASP中利用Command对象调用MSSQL存储过程属性简述

command|command对象|sql|存储过程 很多文章都介绍过,在ASP中调用MSSQL存储过程(Stored Procedure)的介绍.可以使用两种方法:利用recordset对象,或者直接用command对象. recordset对象相当简单,熟悉Asp的都能上手操作,这里简单做个实例: Mssql 中建立存储过程SP_UserList :CREATE PROCEDURE SP_UserList @Uid intASselect * from Users where Uid = @

new-关于对象调用问题,求大师解说下这段代码

问题描述 关于对象调用问题,求大师解说下这段代码 public class Test2 { int i = 0; Test2(int i) { this.i = i; } Test2 increament() { i++; return this; } void print() { System.out.println("i = " + i); } public static void main(String[] args) { Test2 t = new Test2(100); t.

java 某个类的几个对象,这些对象调用类中一个函数,是各自拥有自己的函数代码还是使用同一段代码?

问题描述 1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?2.java 继承中,子类从父类得到一些普通函数,这些函数的代码,是子类自己独自拥有一份还是和父类使用同一段函数代码.3.第一次发帖,积分什么的不会搞,貌似自己也没有积分,呵呵,大家包涵! 解决方案 引用1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?这几个对象调用的当然是同一段代码了.jvm中有一个ja

java中对象调用方法返回一个对象的问题

问题描述 java中对象调用方法返回一个对象的问题 例如session.createQuery(hql); 那么这条语句返回的对象属于哪个类呢,如何判断呢? 解决方案 ctrl加鼠标点击createQuery,会有返回方法,或者你在通过session点的时候也可以看到返回方法. 解决方案二: 按住ctrl点击方法,自己去看方法的返回值. 解决方案三: 在java中将一个对象的所有方法打印出来java中远程对象方法调用中的安全策略问题java中返回局部对象问题 解决方案四: 事实上他返回的还是qu

加载微信的jssdk后,通过文档提供的wx对象调用,提示wx为undefined

问题描述 加载微信的jssdk后,通过文档提供的wx对象调用,提示wx为undefined <head> <meta charset=""utf-8""> <meta http-equiv=""X-UA-Compatible"" content=""IE=edge""> <meta name=""viewport"&

解读分布式对象存储系统Sheepdog性能测试

Sheepdog是一个分布式对象存储系统,专为虚拟机提供块存储,号称无单点.零配置.可线性扩展(省略更多优点介绍).本文主要关注其性能究竟如何,测试版本为目前的最新稳定版0.7.4. 测试环境 节点数量:6个 磁盘:各节点都配备7200转SATA硬盘,型号WDC WD10EZEX-22RKKA0,容量为1TB,另外测试节点(即用于启动虚拟客户机的宿主机)多配置一块SSD硬盘,型号INTEL SSDSA2CW300G3,容量为300GB 网络:测试节点配备PCI-E双千兆网卡,通过bonding进

java 编程-关于java对象调用的一个菜鸟级问题

问题描述 关于java对象调用的一个菜鸟级问题 本人新手,币也不够,帮帮忙吧大家.学java不久,遇到这么一个问题:怎么在一个类中调用另一个类的对象获取该对象数据呢?(两个类不在同一个包里)如包a中有class A{} 和两个对象A a1=new A():A a2=new A();包b中有class B{}.我要在b包中访问a1和a2应该怎么访问呀?要求b包不再生成新的A类对象,且A类不能是单例. 解决方案 a中添加class Global{ static public A a1; static

LinkedIn 开源其分布式对象存储系统 Ambry

日前,LinkedIn在Github上基于Apache 2许可证协议开源了其分布式对象存储系统Ambry.Ambry是一个是不可变对象的存储系统,非常易于扩展,它能够存储KB到GB大小的不可变对象,并且能够实现高吞吐和低延迟,该系统支持跨数据中心的双活部署,并且存储成本低廉.它特别适于存储各种媒体内容. 据Linkedin的前工程主管Sriram Subramanian介绍,媒体内容在Web中已经无处不在,Linkedin中的每项新特性基本上都会与某种类型的媒体内容进行交互.这些媒体内容会存储在