好久没更新了,推出beanstalkd php后台队列系统利器
2015-01-14 16:04
495 查看
开头语:
最近使用了phalcon的php c语言编写的框架,在我们项目组由我推进了这个框架的使用,现在基本初步阅读了下c源码,同时将phalcon-php-framework-documentation.pdf 熟读于胸,di router mvc view cache model phql assets等组件已经使用的比较好,前面已经写了篇blog介绍js压缩和css压缩的方法,就是灵活使用了assets管理组件。
主题:
今天向大家推荐beanstalkd的队列系统,它其实就是一个简单的队列系统,这里我们主要期望利用它来解决一些长时间的任务处理。
举例场景:
比如用户重置密码功能的时候 点击发送重置密码邮件,或者点击 生成报告 这样的 长时间处理的功能。界面不应该将它停留在请求中,而是直接将任务插入队列系统,然后就可以返回给用户,告诉他请稍候收取邮件或者没收到,再发一份。或者生成报告时候 插入队列后返回界面,然后轮询报告生成进度 这类的友好处理。
思想来源:
Do blocking work in the background
Process a video, send e-mails, compress a file or an image, etc., are slow tasks that must be processed in background jobs. There are a variety of tools that provide queuing or messaging systems that work well with PHP • Beanstalkd • Redis • RabbitMQ
• Resque • Gearman • ZeroMQ
设计思路:
组件1:安装beanstalkd,它其实就是一个监听服务,默认11300端口。
class Queue extends BeansTalk{
public function __construct()
{
parent::__construct(array(
'host' => 'localhost',
'port' => '11300'));
}
}
然后就使用单例模式创建该queue,就可以使用putqueue插入队列,然后后台起一个轮询的任务workerfactory
while ($queue->peekReady() !== false) {
$job = $queue->reserve();
echo "report begin\n";
$message = (object)$job->getBody();
$Factory = new WorkFactory();
$reportWorker = $Factory->create($message->type);
$reportWorker->doWork($message->params);
echo "\nreport end\n";
}
该部分使用了cli模式的phalcon框架 php /var/www/html/apps/cli/cli.php work main 即可调用workerfactory分发任务
组件2:daemontools
daemontools is a collection of tools for managing UNIX services.supervise monitors a service.It starts the service and restarts the service if it dies.
写了个shell循环调用 guiwork
#!/bin/sh
while true
do
sh /var/www/html/apps/scripts/reportworker.sh 1>/dev/null 2>&1 &
sleep 60;
done
reportworker.sh 调用php /var/www/html/apps/cli/cli.php work main
daemontools supervise监控 guiwork
总结:
基本上就是后台一分钟循环执行一次shell 执行调用php 查询queue取任务,然后执行。
在任务完成时间较长的情况下,加入A任务一分钟还没完成,下一个一分钟会另外又有起个worker取到queue里面的新的job B ,
从而逐渐增加worker 加速处理 直到任务完成的 设计,这样一方面不会 起太多的进程,另一方面也不会在大量任务插入后处理不了的任务积累。
展望:
进一步 beanstalkd支持分布式处理,现阶段,我们还是在一台服务器上执行,等真正用户量上来后,也方便扩展,将报告的worker直接扔到report专门的处理系统
最近使用了phalcon的php c语言编写的框架,在我们项目组由我推进了这个框架的使用,现在基本初步阅读了下c源码,同时将phalcon-php-framework-documentation.pdf 熟读于胸,di router mvc view cache model phql assets等组件已经使用的比较好,前面已经写了篇blog介绍js压缩和css压缩的方法,就是灵活使用了assets管理组件。
主题:
今天向大家推荐beanstalkd的队列系统,它其实就是一个简单的队列系统,这里我们主要期望利用它来解决一些长时间的任务处理。
举例场景:
比如用户重置密码功能的时候 点击发送重置密码邮件,或者点击 生成报告 这样的 长时间处理的功能。界面不应该将它停留在请求中,而是直接将任务插入队列系统,然后就可以返回给用户,告诉他请稍候收取邮件或者没收到,再发一份。或者生成报告时候 插入队列后返回界面,然后轮询报告生成进度 这类的友好处理。
思想来源:
Do blocking work in the background
Process a video, send e-mails, compress a file or an image, etc., are slow tasks that must be processed in background jobs. There are a variety of tools that provide queuing or messaging systems that work well with PHP • Beanstalkd • Redis • RabbitMQ
• Resque • Gearman • ZeroMQ
设计思路:
组件1:安装beanstalkd,它其实就是一个监听服务,默认11300端口。
class Queue extends BeansTalk{
public function __construct()
{
parent::__construct(array(
'host' => 'localhost',
'port' => '11300'));
}
}
然后就使用单例模式创建该queue,就可以使用putqueue插入队列,然后后台起一个轮询的任务workerfactory
while ($queue->peekReady() !== false) {
$job = $queue->reserve();
echo "report begin\n";
$message = (object)$job->getBody();
$Factory = new WorkFactory();
$reportWorker = $Factory->create($message->type);
$reportWorker->doWork($message->params);
echo "\nreport end\n";
}
该部分使用了cli模式的phalcon框架 php /var/www/html/apps/cli/cli.php work main 即可调用workerfactory分发任务
组件2:daemontools
daemontools is a collection of tools for managing UNIX services.supervise monitors a service.It starts the service and restarts the service if it dies.
写了个shell循环调用 guiwork
#!/bin/sh
while true
do
sh /var/www/html/apps/scripts/reportworker.sh 1>/dev/null 2>&1 &
sleep 60;
done
reportworker.sh 调用php /var/www/html/apps/cli/cli.php work main
daemontools supervise监控 guiwork
总结:
基本上就是后台一分钟循环执行一次shell 执行调用php 查询queue取任务,然后执行。
在任务完成时间较长的情况下,加入A任务一分钟还没完成,下一个一分钟会另外又有起个worker取到queue里面的新的job B ,
从而逐渐增加worker 加速处理 直到任务完成的 设计,这样一方面不会 起太多的进程,另一方面也不会在大量任务插入后处理不了的任务积累。
展望:
进一步 beanstalkd支持分布式处理,现阶段,我们还是在一台服务器上执行,等真正用户量上来后,也方便扩展,将报告的worker直接扔到report专门的处理系统
相关文章推荐
- PHP+MYSQL新闻系统开发之后台编辑更新文件admin_news_edit.php
- PHP+MYSQL新闻系统开发之后台更新与删除文件admin_news_class.php
- beanstalkd一个高性能分布式内存队列系统
- PHP 安全更新被指无效,官方推出新解决方案
- Beanstalkd 一个高性能分布式内存队列系统
- php大力力 [030节] php设计系统后台菜单
- Beanstalkd一个高性能分布式内存队列系统
- 对自己的博客做了更新,专注:php程序开发、php商城开发、PHP会员系统开发,地点:南京
- [PHP学习教程 - 系统]002.模拟守护进程(Daemon)-程序永远在后台运行
- 高性能分布式内存队列系统: Beanstalkd
- 织梦后台更新,报错DedeCMS Error:Tag disabled:"php" more...
- php大力力 [034节] 今天做出系统后台页面的界面啦
- Beanstalkd 一个高性能分布式内存队列系统
- 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本
- 高性能分布式内存队列系统beanstalkd(转)
- Beanstalkd 一个高性能分布式内存队列系统
- Wince后台系统补丁更新实现
- 如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本
- php消息队列beanstalkd使用
- pinphp3.0后台系统权限管理的bug