Laravel 4.2 中队列服务(queue)使用感受
Laravel框架的队列组件为异步处理任务提供了一个统一的API接口。这一功能特别适用于处理耗时任务,如延迟发送电子邮件等,从而显著加快Web请求处理速度。
Laravel的队列服务在4.2版本中引入了redis作为队列存储,这是一个令人振奋的消息。队列服务的运作机制并不复杂。简而言之,有一个地方存放队列信息,PHP进程在运行时将任务写入,一个PHP守护进程则轮询队列信息,执行达到要求的任务并删除。由于PHP是同步语言,Laravel提供了一个守护进程工具来查询并执行队列信息。
在Laravel中,队列的配置文件位于/app/config/queue.php。其中,默认队列驱动器可以选择"sync"(本地调试用的同步驱动器)、"beanstalkd"(专业队列服务驱动器)、"sqs"和"iron"(国外第三方队列服务),以及"redis"。我们选择使用redis,这不仅为我们的队列服务提供了便利,还让我们能够将缓存服务和session服务全部迁移到redis上。
使用队列服务需要创建任务类,这些类作为独立存在,不需要继承其他类。因为队列中的任务是由PHP守护进程独立调用的。在我们的系统中,大量需要与微信服务器交互的任务就被独立成了CurlJsonQueue类。
使用队列服务非常简单。例如,我们可以使用以下代码将任务推入队列:
```php
use Queue;
Queue::push('CurlJsonQueue', [
'url' => $url,
'json' => $json
]);
```
这就是一个标准的队列压入流程。在这个流程中,CurlJsonQueue类被放到了services根目录下。这个类的主要方法是fire(),它接收两个参数:$job和$data。由于我们在BaseController中封装了post的curl模块,所以在CurlJsonQueue类中直接调用了这个模块。需要注意的是,我们在调用base_post_curl()时将其设置为public而非protected,以确保其能够被正确调用。
我们通过执行以下命令启动守护进程来处理队列中的任务:
```bash
php artisan queue:listen
```
这个命令将启动守护进程开始处理队列中的任务。请注意根据实际情况调整代码中的PHP命令和artisan文件的路径。您可能已经注意到,我们的队列系统集成了redis和PHP命令行。在测试环境中,您可以轻松地通过开机启动或手动启动来运行它们。在生产环境中,为了确保它们的稳定运行,我们采用了supervisor这一强大的工具。关于supervisor的安装与配置,建议您参考相关文档,其中虽然可能隐藏着一些需要注意的细节,但正是这些细节使得系统更加稳健。
配置完成后,启动redis和PHP命令行,整个系统就会如丝滑般顺畅地运行。
使用感受
我们的队列服务表现卓越。之前,应用程序的交互流程需要6-7秒,而采用异步处理后,这个时间被缩短至2秒以内,几乎只剩下传输时间和PHP代码运行时间。尽管队列服务的默认设置是每秒检查一次redis中是否有待运行的服务,这在阿里云服务器上大约会占用单核的10%,资源消耗略大,且队列处理时间相对较长,失去了同步时的文件加载优势。但如果有多个任务,PHP进程会连续执行,而不会每秒执行一个。
狼蚁网站SEO优化的注意事项
在优化狼蚁网站的过程中,我们遇到了一些需要注意的问题。
1. 队列的核心类使用了一个特殊函数,导致没有明确类型的变量会以单元素数组的形式存储为json,然后再存入redis。解决这个问题的方法是在每个要存储的数据前面添加'',强制进行字符串类型声明。虽然上面的$url和$json变量由于已经在前面用引号进行了类型声明,所以不需要进行这一步操作。
2. 当需要将url传递给队列时,系统的queue类会在每个'/'前面添加两个'\\'。这对于某些特殊操作可能会产生影响。虽然这个问题可能不会像之前提到的那个问题那样致命,但仍然需要留意。
我们的队列系统在处理任务和与应用程序的交互方面表现出色,但在使用过程中仍需注意一些细节,以确保系统的稳定运行和最佳性能。通过合理的配置和优化,您可以充分利用这一系统,提升应用程序的效率和用户体验。如果您有任何疑问或需要进一步的技术支持,请随时联系我们。我们也欢迎您分享使用该系统过程中的经验和心得。
编程语言
- Laravel 4.2 中队列服务(queue)使用感受
- 通过源码解析Laravel的依赖注入
- 19款Javascript富文本网页编辑器
- asp+JMAIL实现发送邮件
- JavaScript之DOM插入更新删除_动力节点Java学院整理
- 腾讯QQ微博API接口获取微博内容
- 浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
- 浅谈c#设计模式之单一原则
- 小偷程序2
- Yii2 rbac权限控制之rule教程详解
- 使用HTML5+Boostrap打造简单的音乐播放器
- 详解解决Vue相同路由参数不同不会刷新的问题
- javascript每日必学之运算符
- 使用ASP.NET一般处理程序或WebService返回JSON的实现
- JavaScript DOM元素尺寸和位置
- android上传图片到PHP的过程详解