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连接MySQL代码的参数说明
Jun 07 PHP
PHP ajax 分页类代码
Nov 13 PHP
使用php实现快钱支付功能(涉及到接口)
Jul 01 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
PHP中变量引用与变量销毁机制分析
Nov 15 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
详解php命令注入攻击
Apr 06 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 PHP
PHP 99乘法表的几种实现代码
Oct 13 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类(查找/修改)xml文档
2013/03/26 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
2019/11/13 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
Python中运行并行任务技巧
2015/02/26 Python
Python管理Windows服务小脚本
2018/03/12 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python实现猜拳小游戏
2020/04/05 Python
django创建简单的页面响应实例教程
2019/09/06 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
J2EE面试题大全
2016/08/06 面试题
财务人员担保书
2014/05/13 职场文书
端午节活动总结
2014/08/26 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android