博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gearman + PHP 实现分布式对象调用
阅读量:5927 次
发布时间:2019-06-19

本文共 2642 字,大约阅读时间需要 8 分钟。

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安全的文章。

我的系列文档

 

 

目录

1. Gearman Job Server

文本格式回复

yum install gearmand

2. Gearman PHP扩展

PHP扩展安装

#!/bin/bashyum install libgearman-devel -ypecl install gearmancat >> /srv/php/etc/conf.d/gearman.ini <

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

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

测试脚本 server.php

addServer();$worker->addFunction("reverse", "my_reverse_function");while ($worker->work());function my_reverse_function($job){ return strrev($job->workload());}?>

测试脚本 client.php

addServer();print $client->doNormal("reverse", "Hello World!");?>

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

 

3. 参数传递与返回值

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

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

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

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

Server

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

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)

转载地址:http://rmovx.baihongyu.com/

你可能感兴趣的文章
ecmall 用户后台店铺条幅 在firefox7 以上无法预览的问题
查看>>
storm安装
查看>>
c++11
查看>>
[LCA][数学]JZOJ 4794 富爷说是一棵树
查看>>
卡尔曼滤波——5.首先高斯分布
查看>>
各种排序算法汇集
查看>>
20155225 2016-2017-2 《Java程序设计》第七周学习总结
查看>>
十天冲刺开发第十天个人工作总结
查看>>
第十六周进度条
查看>>
Windows 如何远程登陆 Server 的 jupyter
查看>>
Redis 数据结构之Keys
查看>>
c语言第二次作业
查看>>
Android Integer.parseInt java.lang.NumberFormatException: Invalid int解决方法
查看>>
java集合的简单使用
查看>>
全面剖析Cocos2d游戏触摸机制 (上)
查看>>
Getting Started with iOS Development Part9:Preparing your application for "In App Purchases"
查看>>
EF多对多关系中如何利用关系表(EF4.1 Many to Many involves junction table details)
查看>>
mongodb快速均衡导入数据
查看>>
CSS3动画 3DBOX
查看>>
第一周总结
查看>>