假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!
但实际上,我们很可能有超过1万的邮件。怎么处理这个延迟的问题?
答案就是用异步。把“发邮件”这个操作封装,然后后台异步地执行1万遍。这样的话,用户提交网页后,他所等待的时间只是“把发邮件任务请求推送进队列里”的时间。而我们的后台服务将在用户看不见的地方跑。
在实现“异步队列”这点上,有人采用MysqL知识库" href="http://lib.csdn.net/base/14" target="_blank">MysqL表或者redis来存放待发送的邮件,然后,每分钟定时读取待发送列表,然后处理。这便是定时异步任务队列。但当前提交的任务要一分钟后才能执行,在某些实时性要求应用场景里还是不快。有些场景要求,只有一提交任务,便马上执行,但用户不需要等待返回结果。
本文将探讨用PHP扩展swoole实现实时异步任务队列的方案。
在打算放置脚本的目录(你也可以自行新建)新建Server.PHP,代码如下
PHP
->serv = swoole_server("0.0.0.0",9501 ->serv->set( 'worker_num' => 1,cpu数的1-4倍
'daemonize' => 1,
'max_request' => 10000, 'dispatch_mode' => 2, 'task_worker_num' => 8,数量
"task_ipc_mode " => 3, "log/taskqueueu.log",//日志
->serv->on('Receive',(,'onReceive'
->serv->on('Task','onTask' ->serv->on('Finish','onFinish' ->serv->
onReceive(swoole_server ,,,
->task(
onTask(,, = json_decode(, (['url' ->httpGet(['url'],['param'
onFinish(,
httpGet(, ( .= '?' . ( = curl_init();
curl_setopt(,CURLOPT_URL,);
curl_setopt(,CURLOPT_RETURNTRANSFER,1);
curl_setopt(,CURLOPT_SSL_VERIFYPEER, curl_setopt(,CURLOPT_SSL_VERIFYHOST, curl_setopt(,CURLOPT_HEADER,0); 输出返回头信息
= curl_exec();
curl_close(); 关闭会话
= Server();
启动服务后,让我们看看如何调用服务。新建测试文件Client_test.PHP
PHP
->client =
(!->client->connect("127.0.0.1",9501,1 (('Swoole Error: %s',->client->
send( (->client-> (!( = json_encode(
->client->send( } ('Swoole Server does not connected.'
->client->
= "url" => "http://192.168.10.19/send_mail", "param" => "username" => 'test', "password" => 'test'
= -> (->send( 'success' } 'fail' ->close();
在上面代码中,url即为任务所在地址,param为所需传递参数。
保存好代码,在命令行或者浏览器中执行Client_test.PHP,便实现了异步任务队列。你所填写的URL,将会在每次异步任务被提交后,以HTTP GET的方式异步执行。