热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

GearmanPHP实现分布式对象调用http:netkiller.github.iojournalgearman.php.htmlMr.NeoChen(netkiller),陈景



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 <extension&#61;gearman.so
EOF


确认模块是否安装&#xff0c;同时检查gearman扩展的版本。


# php -m | grep gearman
gearman
# php -r &#39;printf("%s\r\n",gearman_version());&#39;
1.1.8

测试脚本 server.php



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


测试脚本 client.php



$client&#61; new GearmanClient();
$client->addServer();
print $client->doNormal("reverse", "Hello World!");
?>


我用&#39;o&#39; 表示与上次备份中有差异的部分。



 




3. 参数传递与返回值



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


如果托传递多个参数&#xff0c;需要将参数序列化后传递


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




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



Server



require &#39;Doctrine/Common/ClassLoader.php&#39;;
use Doctrine\Common\ClassLoader;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Configuration;
$classLoader &#61; new ClassLoader(&#39;Doctrine&#39;, &#39;/www/DoctrineDBAL-2.3.4/&#39;);
$classLoader->register();
$config &#61; new Configuration();
$connectionParams &#61; array(
&#39;dbname&#39; &#61;> &#39;example&#39;,
&#39;user&#39; &#61;> &#39;www&#39;,
&#39;password&#39; &#61;> &#39;password&#39;,
&#39;host&#39; &#61;> &#39;192.168.2.1&#39;,
&#39;driver&#39; &#61;> &#39;pdo_mysql&#39;,
);
$conn &#61; DriverManager::getConnection($connectionParams, $config);
$host &#61; &#39;127.0.0.1&#39;;
$port &#61; 4730;
echo "Starting\n";
# Create our worker object.
$gmworker&#61; 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() !&#61; GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function members($job)
{
global $conn;
$param &#61; unserialize($job->workload());
print_r($param);
$sql &#61; "SELECT username FROM members limit ".$param[&#39;limit&#39;].",".$param[&#39;offset&#39;];
$stmt &#61; $conn->query($sql);
while ($row &#61; $stmt->fetch()) {
//printf("%s\r\n", );
$result[] &#61; $row[&#39;username&#39;];
}
return serialize($result);
}


Client



# create our client object
$gmclient&#61; new GearmanClient();
# add the default server (localhost)
$gmclient->addServer();
# run reverse client in the background
$job_handle &#61; $gmclient->doNormal("members",serialize(array(&#39;limit&#39;&#61;>5,&#39;offset&#39;&#61;>10)));
if ($gmclient->returnCode() &#61;&#61; GEARMAN_SUCCESS)
{
print_r(unserialize($job_handle));
}


运行结果


$ php client.php
Array
(
[0] &#61;> 257000005
[1] &#61;> 257000006
[2] &#61;> 257000009
[3] &#61;> 257000010
[4] &#61;> 257000011
[5] &#61;> 257000012
[6] &#61;> 257000013
[7] &#61;> 257000014
[8] &#61;> 257000015
[9] &#61;> 257000016
)






推荐阅读
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文探讨了2012年4月期间,淘宝在技术架构上的关键数据和发展历程。涵盖了从早期PHP到Java的转型,以及在分布式计算、存储和网络流量管理方面的创新。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨架构师在项目中应如何平衡对产品的关注和对团队成员的关注,以实现最佳的开发成果。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
author-avatar
国国国国涛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有