gearman初探:(三、异步发送邮件)

经过前面的工作,一切就绪。下面就开始最最重点的部分——异步发送邮件

在发送邮件之前,先用gearman官网上的例子热热身

client.php:

<?php
$client = new GearmanClient();
$client->addServer();
echo $client->do("reverse", "Hello World!");
?>

worker.php:

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("reverse", function ($job) {
  return strrev($job->workload());
});
while ($worker->work());
?>
Client 和 Worker 都需要通过addServer函数连接到服务器上,默认主机是127.0.0.1,默认端口是4730
代码部署好之后,运行Worker
#php ./worker.php

让worker一直处于循环等待工作请求的状态

然后运行Client

#php ./client.php

这时你会看到一串被反转的hello world!    说明系统已正常工作。

我们正式使用Gearman来发送邮件,代码如下:

client.php

<?php
$client = new GearmanClient();
$client->addServer();
echo $client->do("sendmail", "Hello World!");
?>

workder.php

<?php
require_once 'mail/PHPMailerAutoload.php';
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("sendmail", function ($job) {
            $mail = new PHPMailer;
            //$mail->SMTPDebug = 3;                   // Enable verbose debug output
            $mail->isSMTP();                         // Set mailer to use SMTP
            $mail->Host = 'smtp.qq.com';  // Specify main and backup SMTP servers
            $mail->SMTPAuth = true;                  // Enable SMTP authentication
            $mail->Username = 'xxxxxx@qq.com';        // SMTP username
            $mail->Password = 'yyyyy';                 // SMTP password
            $mail->SMTPSecure = 'tls';  // Enable TLS encryption, `ssl` also accepted
            $mail->Port = 587;                      // TCP port to connect to

            $mail->From = 'xxxxxx@qq.com';
            $mail->FromName = 'Mailer';
            $mail->addAddress('yyyyyyyy@gmail.com', 'Joe User');  // Add a recipient

            $mail->WordWrap = 50;                    // Set word wrap to 50 character
            $mail->isHTML(true);                     // Set email format to HTML

            $mail->Subject = 'Here is the subject';
            $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
            $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
            if(!$mail->send()) {
                	    echo 'Message could not be sent.';
                    	 echo 'Mailer Error: ' . $mail->ErrorInfo;
            } else {
                    	 echo 'Message has been sent';
            }
            return true;
    });
    while ($worker->work());
?>

mail为邮件发送类库所在文件夹,注意它的位置 要让worker.php能引用到它。 

运行workder.php,然后运行client.php。邮件发送出去后,worker端会收到一个成功消息。这时候你会发现client 依然是被阻塞的,要等到邮件被发送出去后才返回。那是因为client的do方法是同步的,改为doBackground就是异步的,这时发现client立即返回了,邮件放在后台发送。这样程序不必等待就可以继续往下执行,用户体验很好。 


现在的client,worker和job server都在同一台机器上,如果计算任务量比较大,可以准备几台机器专门做worker,只要client和worker都能连上job server,系统就会正常运作,从而真正达到分布式异步计算的目的。

转载于:https://my.oschina.net/yongbaolinux/blog/342288

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值