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 数组入门教程小结
May 20 PHP
PHP 变量类型的强制转换
Oct 23 PHP
php array_walk() 数组函数
Jul 12 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
使用PHP编写发红包程序
Jul 22 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
Oct 22 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
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
高效使用Python字典的清单
2018/04/04 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python简易版停车管理系统
2019/08/12 Python
python 三元运算符使用解析
2019/09/16 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
小学生打架检讨书
2014/01/26 职场文书
学会感恩主题班会
2015/08/12 职场文书
装修安全责任协议书
2016/03/22 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis