PHP 没有提供直接的并发功能。要实现并发,必须:
function asyn_send(){
$fp = fsockopen('localhost', 80, &$errno, &$errstr, 5);
if(!$fp){
echo "$errstr ($errno) /n";
}
fputs($fp, "GET /sync.php?param=1&param2=2&a=c/r/n");
fclose($fp);
}
要不然, PHP 会逐条代码执行,上一条执行完成后才会执行下一条。而上面这种方式处理扩展性不够强。
PHP 的 Gearman 库能把工作分发给一组机器。Gearman 会对作业进行排队并少量分派作业,而将那些复杂的任务分发给为此任务预留的机器。
这个库对 Perl、Ruby、C、Python 及 PHP 开发人员均可用,并且还可以运行于任何类似 UNIX® 的平台上,包括 Mac OS X、 Linux® 和 Sun Solaris。
向一个 PHP 应用程序添加 Gearman 非常简单。我们是将 PHP 应用程序托管在一个典型的 LAMP 配置上,那么 Gearman 将需要一个额外的守护程序以及一个 PHP 扩展。
 
安装 Gearman
======================
向一个机器添加 Gearman 需要两步:
1.构建并启动这个守护程序
2.构建与 PHP 版本相匹配的 PHP 扩展。
 
守护程序
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个守护程序包包括构建此扩展所需的所有库。
首先,下载 Gearman 守护程序 gearmand 的最新源代码,解压缩这个 tarball,构建并安装此代码(安装需要有超级用户的权限,即根用户权限)。
 
下载页面是:https://launchpad.net/gearmand/
 
wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz
tar -zxf gearmand-1.1.5.tar.gz
cd gearmand-1.1.5
./configure
这时报错:
checking whether build environment is sane... configure: error: newly created file is older than distributed files!
原来是系统时间不对.重新设置一下时间
设置好后又报错:
cannot find Boost headers version
这是因为boost的版本低于 1.37.0,需要安装超过1.37.0的boost库
可以去下载新一点的boost库,下载地址为
http://sourceforge.net/projects/boost/files/boost/1.53.0/
 
wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz/download
下载完毕后,解压缩包
tar -zxf boost_1_44_0.tar.gz
然后进入目录boost_1_44_0执行
./bootstrap.sh --prefix=/usr/local/boost
生成bjam以后,再执行
./bjam install
执行软链接
ln -s /usr/local/boost/include/boost/ /usr/local/include/boost
ln -s /usr/local/boost/lib/libboost_program_options.so  /usr/lib/libboost_program_options.so
ln -s /usr/local/boost/lib/libboost_program_options.so.1.53.0 /usr/lib/libboost_program_options.so.1.53.0 
 
回到gearmand-1.1.5目录
make
make install
 
PHP 扩展
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
安装 gearmand 后,构建 PHP 扩展。从 PECL 获取这个 tarball,也可以从 Github 复制该存储库。
wget http://pecl.php.net/get/gearman-1.1.1.tgz
tar -zxf gearman-1.1.1.tgz
cd gearman-1.1.1
 
有了这些代码后,就可以开始构建扩展了:
phpize
./configure --with-php-config=/usr/local/php/bin/php-config 
make
make install
这个 Gearman 守护程序通常被安装在 /usr/local/sbin。
可以从命令行直接启动此守护程序,也可以将这个守护程序添加到启动配置中,以便在机器每次重启时就可以启动这个守护程序。
接下来,需要安装 Gearman 扩展。
打开 php.ini 文件(我的在:/usr/local/php/etc/php.ini 可以通过:find / -type f -name php.ini 查找),然后添加代码行 extension = gearman.so:
vi /usr/local/php/etc/php.ini
...
extension = gearman.so
 
保存此文件。要想验证扩展是否启用,请运行 php --info,然后查找 Gearman:
php --info | grep "gearman support"
得到结果:
gearman support => enabled
 
此外,还可以用一个 PHP 代码片段来验证构建和安装是否得当。将这个小应用程序保存到 verify_gearman.php:
<?php
  print gearman_version() . "\n";
?>
接下来,从命令行运行此程序:
$ php verify_gearman.php
1.1.5
如果这个版本号与之前构建和安装的 Gearman 库的版本号相匹配,那么系统就已准备好了。
 
运行 Gearman
======================
一个 Gearman 配置有三个角色:
一个或多个 producer 生成工作请求。每个工作请求命名它所想要的函数,例如 email_all 或 analyze。
一个或多个 consumer 完成请求。每个 consumer 命名它所提供的一个或多个函数并向 agent 注册这些功能。
一个 consumer 也可以被称为是一个 worker。
代理对与之建立连接的那些 consumer 提供的所有服务进行集中编制。它将 producer 与恰当的 consumer 联系起来。
借助如下的命令行,可以立即体验 Gearman:
启动这个 agent,即 Gearman 守护程序:
/usr/local/sbin/gearmand --daemon
报错:Could not open log file "/usr/local/var/log/gearmand.log", from "/usr/sbin", switching to stderr. (No such file or directory)
解决:
mkdir -p /usr/local/var/log/
cd /usr/local/var/log/
touch gearmand.log
再次尝试启动:
/usr/local/sbin/gearmand --daemon
成功运行.查看进程:ps -ef | grep gearmand
root     19390     1  0 17:50 ?        00:00:00 gearmand --daemon
root     19403     1  0 17:54 ?        00:00:00 /usr/local/sbin/gearmand --daemon
root     19406  1556  0 17:54 pts/3    00:00:00 grep gearmand
 
从 PHP 使用 Gearman
======================
从 PHP 使用 Gearman 类似于之前的示例,惟一的区别在于这里是在 PHP 内创建 producer 和 consumer。
每个 consumer 的工作均封装在一个或多个 PHP 函数内。
先用 PHP 编写的一个 Gearman worker。将这些代码保存在一个名为 worker.php 的文件中。
<?php
  $worker= new GearmanWorker();
  $worker->addServer();
  $worker->addFunction("title", "title_function");
  while ($worker->work());
   
  function title_function($job)
  {
    return ucwords(strtolower($job->workload()));
  }
?>
 
再用 PHP 编写的一个 producer,或 client。将此代码保存在一个名为 client.php 的文件内。
<?php
  $client= new GearmanClient();
  $client->addServer();
  print $client->do("title", "AlL THE World's a sTagE");
  print "\n";
?>
 
现在,可以用如下的命令行连接客户机与 worker 了:
php worker.php &
php client.php
结果:
All The World's A Stage

gearman入门初步的更多相关文章

  1. 菜鸟玩云计算之二十:saltstack入门初步

    菜鸟玩云计算之二十 SaltStack 入门初步 0. saltstack 是什么 参考下面的文章: http://docs.saltstack.com/en/latest/topics/tutori ...

  2. makefile入门-初步了解

    自己开始学习makefile是由于VScode配置工程文件,看别人的配置不是很懂,于是决定入门学习下makefile. 先来说说makefile是做什么用的:makefile可以实现工程的自动化编译, ...

  3. LinQ实战学习笔记(一) LINQ to (Objects, XML, SQL) 入门初步

    LINQ对于笔者来说, 优美而浓缩的代码让人震惊. 研究LINQ就是在艺术化自己的代码. 之前只是走马观花学会了基本的语法, 但是经常在CSDN看到令人惊讶自叹不如的LINQ代码, 还是让人羡慕嫉妒恨 ...

  4. 45、Docker 加 tensorflow的机器学习入门初步

    [1]最近领导天天在群里发一些机器学习的链接,搞得好像我们真的要搞机器学习似的,吃瓜群众感觉好神奇呀. 第一步 其实也是最后一步,就是网上百度一下,Docker Toolbox,下载下来,下载,安装之 ...

  5. struts入门初步(一)

      struts2.0与struts1.0运用了不同的框架,有一定的不兼容性. struts2.0借鉴了webwork的框架思想. Struts2的基本步骤: 1.拷贝struts的jar到项目中(导 ...

  6. zabbix监控入门初步

    1.Zabbix是什么? Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. 2.Zabbix的功能和特性 (1)安装与配置简 ...

  7. 46、tensorflow入门初步,手写识别0,1,2,3,4,5,6

    1.使用tensorflow的SoftMax函数,对手写数字进行识别 Administrator@SuperComputer MINGW64 ~ $ docker run -it -p 8888:88 ...

  8. LAMP平台搭建菜鸟入门级实验

    LAMP平台搭建(菜鸟入门级) mysql 安装: (1)二进制安装  二进制安装 ,执行解压配置即可.无须执行三布安装. (2)源码编译安装 安装准备工作: (1)查看系统配置:#uname -a/ ...

  9. 小爬爬1:开篇&&简单介绍启动

    1.第一阶段的内容 2.学习的方法? 思考,总结,重复 3.长大了意味着什么?家庭的责任,真的很重 4.数据分析&&数据清洗 numpy&&pandas&&am ...

随机推荐

  1. 解决Mysql Workbench的Error Code: 1175错误 无法删除数据

    使用workbench,如果你要批量更新或删除数据,一般会报“ Error Code: 1175 You are using safe update mode and you tried to upd ...

  2. hive算法报错..

    hive普通语句查询报错.. 查到以下设定项,,附加在语句前执行成功.. 但是有可能没有真正的执行.. 试到最后使用标红的三行附加在语法前执行成功 set hive.execution.engine= ...

  3. 【Java并发编程】:死锁

    当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2.接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持 ...

  4. 数据库-转换sql语句

    文章描述:主要说明转换成SQL语句的过程.----必要信息(数据库名,表名,条件)转换成SQL语句 一些界面上数据增删改查的操作往往只需要输入一数据库名,表名,加条件就可以进行数据查询了,在这背后是怎 ...

  5. 自学C Primer Plus时还没想明白的问题

    2016年11月24日 1. 计算机中两个浮点数怎样进行加法运算.2. 为什么计算机在计算时存在损失精度的可能3. 无符号数和有符号数的运算是怎样的4. printf中使用格式控制符的截断问题,比如% ...

  6. Memcached理解笔记3---Memcached使用总结

    为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题: 使用iBatis整合了Memcached,iBatis针对每台server生成了唯一标识,导致同一份数据sql会产生不 ...

  7. python总结--目录(转)

    python模块   [Python]随机数与随机字符串  举例说明Python的CSV模块   python模块之smtplib: 用python发送SSL/TLS安全邮件   python模块之e ...

  8. rails跳过回调的方法

    rails中的回调可跳过,使用下列方法即可: decrement decrement_counter delete delete_all increment increment_counter tog ...

  9. 二维码ZBar之ZBarReaderView

    参考:http://www.chinatarena.com/Html/iospeixun/201301/3985.html   http://blog.csdn.net/chenyong05314/a ...

  10. 哪个先执行:@PostConstruct和@Bean的initMethod?

    结论: /** * step1:执行构造函数 * step2:执行使用@PostConstruct注解修饰的方法[如果有多个,则执行顺序不确定] * step3:执行@Bean注解中initMetho ...