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 相关文章推荐
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
PHP实现的方程求解示例分析
Nov 11 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
Laravel 模型关联基础教程详解
Sep 17 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.ini中文版(1)
2006/10/09 PHP
无限级别菜单的实现
2006/10/09 PHP
数据库的日期格式转换
2006/10/09 PHP
php的一些小问题
2010/07/03 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
php递归调用删除数组空值元素的方法
2015/04/28 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
JS表单验证的代码(常用)
2016/04/08 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
高中物理教学反思
2014/02/08 职场文书
工程管理英文求职信
2014/03/18 职场文书
经营理念口号
2014/06/21 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
2016新年致辞
2015/08/01 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis