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

简介:

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

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

MrNeo Chen (netkiller)陈景峰(BG7NYT)


中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080

$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 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
)
目录
相关文章
|
1月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
21 0
|
6月前
|
SQL 安全 PHP
理解php对象注入
php对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识。
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
|
3月前
|
JSON PHP 数据格式
|
9月前
|
存储 JSON PHP
在 PHP 中从 URL 获取 JSON 对象
在 PHP 中从 URL 获取 JSON 对象
|
7月前
|
JSON 自然语言处理 Java
从分布式到微服务:深入理解网络,网络传输中的对象序列化问题
仅仅懂了Socket编程还不够,因为我们不是简单地写一个发送字符串的Hello World程序,需要实现复杂的对象实例传输,因此,如何将一个对象实例编码成为高效的二进制数据报文传输到对端,并且正确地“还原”出来,就是一个专业的技术问题了。
|
9月前
|
JSON PHP 数据格式
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
55 0
|
9月前
|
定位技术 PHP
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
60 0
|
9月前
|
编解码 前端开发 JavaScript
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
197 0
|
9月前
|
PHP
PHP文件上传属性对象解读
PHP文件上传属性对象解读
42 0