热门标签 | 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
)






推荐阅读
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文详细介绍了 com.facebook.drawee.view.SimpleDraweeView 中的 setScaleType 方法,提供了多个实际代码示例,并解释了其在不同场景下的应用。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
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社区 版权所有