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
)
目录
相关文章
|
8月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
67 0
|
3月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
1月前
|
PHP
PHP中如何比较两个对象
在 PHP 中,比较两个对象可依据状态(属性值)或身份(内存地址)。常用方法包括:1. 使用 `==` 比较属性值;2. 使用 `===` 比较身份和属性;3. 实现 `__equals()` 方法自定义比较逻辑;4. 使用 `spl_object_hash()` 比较对象身份;5. 手动比较属性。选择方法依需求而定。
|
2月前
|
NoSQL 安全 PHP
hyperf-wise-locksmith,一个高效的PHP分布式锁方案
`hyperf-wise-locksmith` 是 Hyperf 框架下的互斥锁库,支持文件锁、分布式锁、红锁及协程锁,有效防止分布式环境下的竞争条件。本文介绍了其安装、特性和应用场景,如在线支付系统的余额扣减,确保操作的原子性。
43 4
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
55 5
|
2月前
|
数据采集 存储 监控
公司监控软件:基于 PHP 的分布式监控系统设计
本文介绍了基于 PHP 的分布式监控系统的设计与实现。该系统包括监控节点、数据采集模块、数据传输模块和监控中心,能够高效地收集、传输和分析各节点的数据,确保系统的稳定运行和安全防护。通过示例代码展示了数据采集、传输及存储的具体实现方法,并强调了安全与可靠性的重要性。
55 3
|
4月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
4月前
|
PHP
PHP中如何比较两个对象
PHP中如何比较两个对象
|
4月前
|
PHP
PHP中的面向对象编程:理解类与对象
本文将深入探讨PHP中面向对象编程的核心概念——类与对象。通过实例讲解,帮助读者更好地理解如何在PHP中运用OOP编写更高效、可维护的代码。
69 9
|
5月前
|
PHP 开发者
PHP中的面向对象编程:掌握类与对象的精髓
探索PHP的面向对象编程世界,本文将带你了解如何通过创建和操作类来实例化对象。我们将深入讲解类的声明、构造函数的使用以及继承和多态性的概念。准备好,让我们一起在代码的海洋中航行,揭开PHP对象编程的神秘面纱!

热门文章

最新文章