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数据库非常慢的解决方法
Jul 05 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
基于php-fpm的配置详解
Jun 03 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 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
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
python快速排序代码实例
2013/11/21 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
简单介绍Python中的floor()方法
2015/05/15 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python清理子进程机制剖析
2017/11/23 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
二手书店创业计划书
2014/01/16 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
爱情保证书大全
2014/04/29 职场文书
宣传普通话标语
2014/06/27 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
解除合同协议书范本
2016/03/21 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
在CSS中使用when/else的方法
2022/01/18 HTML / CSS