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新手上路(三)
Oct 09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
使用php判断服务器是否支持Gzip压缩功能
Sep 24 PHP
PHP判断远程图片是否存在的几种方法
May 04 PHP
php生成QRcode实例
Sep 22 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
yii用户注册表单验证实例
Dec 26 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
PHP二维数组去重实例分析
Nov 18 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
原生php实现excel文件读写的方法分析
Apr 25 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类与对象中的private访问控制的疑问
2012/11/01 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
提高网站信任度的技巧
2008/10/17 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
React 组件间的通信示例
2018/06/14 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
python通过zabbix api获取主机
2018/09/17 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python GUI编程完整示例
2019/04/04 Python
Python的Lambda函数用法详解
2019/09/03 Python
Python帮你识破双11的套路
2019/11/11 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
python中xlutils库用法浅析
2020/12/29 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
PHP面试题大全
2015/10/16 面试题
国际金融专业大学生职业生涯规划书
2013/12/28 职场文书
宣传活动总结范文
2014/07/01 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
2015元旦节寄语
2014/12/08 职场文书
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js