PHP使用gearman进行异步的邮件或短信发送操作详解


Posted in PHP onFebruary 27, 2020

本文实例讲述了PHP使用gearman进行异步的邮件或短信发送操作。分享给大家供大家参考,具体如下:

一、准备工作

1、为了防止,处理业务途中出现的宕机,请配置好gearman的持久化方式。
2、使用gearmanManager来管理我们的worker脚本,方便测试。

上述两条请看我之前写的两篇文章

二、编写测试脚本

sendEmail.php代码如下:

<?php
//注意函数名与文件名相同
function sendEmail($job) {
  $workId = uniqid();

  //workload()获取客户端发送来的序列化数据
  $data = json_decode($job->workload(), true);
  
  //这里模拟处理过程
  //具体的业务,这里应该是请求发送邮件的接口,这里只做演示
  sleep(1);
  
  echo "workId: {$workId} 发送 {$data['email']} 成功\n";
}

client.php代码如下:

<?php
//创建一个客户端
$client = new GearmanClient();
//添加一个job服务
$client->addServer('127.0.0.1', 4730);

$cnt = 5000;
$ret = array();

//循环发送5000条邮件
for($i = 0; $i < $cnt; ++$i) {
  //doBackground异步,返回提交任务的句柄
  $ret[$i] = $client->doBackground('sendEmail', json_encode(array(
    'email' => "{$i}@qq.com",
    'title' => "邮件标题{$i}",
    'body' => "我是内容{$i}",
  )));
}

三、修改gearmanManager中配置信息

我的gearmanManager是安装在/data/GearmanManager/下

> vi /data/GearmanManager/etc/GearmanManager.ini

添加如下信息,我们为sendEmail启动五个进程

[sendEmail]
;指定5个进程
dedicated_count=5
;5个进程都只做sendEmail工作
dedicated_only=1

四、启动gearman

> gearmand -d -q mysql \
--mysql-host=192.168.1.100 \
--mysql-port=3306 \
--mysql-user=gearman \
--mysql-password=123456 \
--mysql-db=gearman \
--mysql-table=gearman_queue &

五、启动gearmanManager

> cd /data/GearmanManager
> ./bin/pecl_manager.php -c /data/GearmanManager/etc/GearmanManager.ini -vvv

PHP使用gearman进行异步的邮件或短信发送操作详解

六、运行client.php

> /data/php56/bin/php /data/client.php

PHP使用gearman进行异步的邮件或短信发送操作详解

当我们对pecl_manager.php进行ctrl+c时,强行关闭worker,client.php那边仍可正常的发送请求,不过数据都被保存在了mysql中。
当我们重新把worker启动时,gearman会重新载入没有处理的进行处理。

PHP使用gearman进行异步的邮件或短信发送操作详解
我的mysql是装在主机的,虚拟机里装了gearman,如果有朋友发现gearman无法连接mysql,可暂时关闭win10防火墙,和开启win10被ping的回显。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php开发文档 会员收费1期
Aug 14 PHP
php中require和require_once的区别说明
Feb 27 PHP
php截取中文字符串函数实例
Feb 23 PHP
CI框架整合smarty步骤详解
May 19 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
Feb 06 PHP
PHP中trait使用方法详细介绍
May 21 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP的简单跳转提示的实现详解
Mar 14 PHP
Laravel find in set排序实例
Oct 09 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 #PHP
php使用gearman进行任务分发操作实例详解
Feb 26 #PHP
php实现根据身份证获取精准年龄
Feb 26 #PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 #PHP
PHP实现创建一个RPC服务操作示例
Feb 23 #PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 #PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 #PHP
You might like
PHP详细彻底学习Smarty
2008/03/27 PHP
解析php入库和出库
2013/06/25 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
jQuery回调方法使用示例
2017/06/26 jQuery
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
详解React 条件渲染
2020/07/08 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
Python中的urllib模块使用详解
2015/07/07 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
公司新员工的演讲稿注意事项
2014/01/01 职场文书
高二学生评语大全
2014/04/25 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
介绍信格式
2015/01/30 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
六一儿童节新闻稿
2015/07/17 职场文书