当前位置: 首页 > news >正文

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 2. 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
)

相关文章:

  • JAVA数据库编程
  • DEDECMS之三 首页、列表页怎么调用文章内容
  • 在opencv中实现中文输出
  • 使用wget下载xcode
  • Java接口中的字段
  • jar包启动与停止
  • 怎么使用微信JSSDK的自定义分享功能
  • YII学习
  • 因为安迪的一句话,这2万5千人凭空多出9亿财富!_财经_腾讯网
  • Ant编译Hadoop 1.0.3的eclipse-plugin插件包
  • [译]使用jquery.cookie操作Cookie说明
  • Linux下Nginx源码安装
  • PHP之路——MySql基础操作语句
  • windows下读取Linux分区软件
  • Angular.js Services
  • [case10]使用RSQL实现端到端的动态查询
  • bearychat的java client
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Electron入门介绍
  • MySQL QA
  • MySQL数据库运维之数据恢复
  • oldjun 检测网站的经验
  • PAT A1092
  • Python学习笔记 字符串拼接
  • SpringBoot几种定时任务的实现方式
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 阿里云Kubernetes容器服务上体验Knative
  • 首页查询功能的一次实现过程
  • MPAndroidChart 教程:Y轴 YAxis
  • #define 用法
  • #mysql 8.0 踩坑日记
  • #QT(一种朴素的计算器实现方法)
  • (+4)2.2UML建模图
  • (k8s中)docker netty OOM问题记录
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)Sql Server 保留几位小数的两种做法
  • (转)负载均衡,回话保持,cookie
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .Net IE10 _doPostBack 未定义
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET中GET与SET的用法
  • .net专家(张羿专栏)
  • @ConditionalOnProperty注解使用说明
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [C++]unordered系列关联式容器
  • [Django ]Django 的数据库操作
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统