[TOC]
# 队列
处理视频,调整图像大小或发送电子邮件等活动不适合在线或实时执行,因为这可能会减慢页面的加载时间并严重影响用户体验。
这里最好的解决方案是实现后台作业。Web应用程序将作业放入队列中,并将单独处理。
虽然您可以找到更复杂的PHP扩展像[RabbitMQ](http://pecl.php.net/package/amqp)等来解决应用程序中的排队问题;Phalcon为[Beanstalk](http://www.igvita.com/2010/05/20/scalable-work-queues-with-beanstalk/)提供了一个客户端,这是一个受[Memcached](http://memcached.org/)启发的工作排队后端。它简单,轻便,完全专门用于排队。
>[danger] 从队列方法返回的一些数据要求安装模块Yaml。有关更多信息,请参阅[此处](http://php.net/manual/book.yaml.php)。您将需要使用Yaml> = 2.0.0
## 将作业(Jobs)放入队列
连接到Beanstalk后,您可以根据需要插入多个作业。您可以根据应用程序的需要定义消息结构:
```php
<?php
use Phalcon\Queue\Beanstalk;
// 连接到队列
$queue = new Beanstalk(
[
'host' => '192.168.0.21',
'port' => '11300',
]
);
// 将作业插入队列中
$queue->put(
[
'processVideo' => 4871,
]
);
```
可用的连接选项包括:
| 选项 | 描述 | 默认 |
| ------ | ---------------------------------------- | --------- |
| host | beanstalk服务器所在的IP | 127.0.0.1 |
| port | 连接端口 | 11300 |
在上面的例子中,我们存储了一条消息,允许后台作业处理视频。消息立即存储在队列中,没有一定的生存时间。
其他选项如:运行时间,优先级和延迟可以作为第二个参数传递:
```php
<?php
// 使用选项将作业插入队列中
$queue->put(
[
'processVideo' => 4871,
],
[
'priority' => 250,
'delay' => 10,
'ttr' => 3600,
]
);
```
可以使用以下选项:
| 选项 | 描述 |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| priority | 它是一个整数<2 ** 32。具有较小优先级值的作业将在具有较大优先级的作业之前安排。最紧急的优先事项是0;最紧急的优先事项是4,294,967,295。|
| delay | 在将作业放入就绪队列之前等待的整数秒。在此期间,工作将处于“延迟”状态。 |
| ttr | 运行时间 - 允许工作人员运行此作业的整数秒。这个时间从工人保留这项工作的那一刻算起。 |
放入队列的每个作业都会返回一个`job id`,您可以使用该ID来跟踪作业的状态:
```php
<?php
$jobId = $queue->put(
[
'processVideo' => 4871,
]
);
```
## 检索消息
将作业放入队列后,后台工作人员可以使用这些消息,这些消息将有足够的时间来完成任务:
```php
<?php
while (($job = $queue->peekReady()) !== false) {
$message = $job->getBody();
var_dump($message);
$job->delete();
}
```
必须从队列中删除作业以避免双重处理。如果实现了多个后台作业worker,则必须`reserved` 作业,以便其他worker进程不会重新处理它们,而其他worker进程则保留它们:
```php
<?php
while (($job = $queue->reserve()) !== false) {
$message = $job->getBody();
var_dump($message);
$job->delete();
}
```
我们的客户端实现了Beanstalkd提供的一组基本功能,但足以允许您构建实现队列的应用程序。
## 高级主题
### 多个队列
Beanstalkd支持多个队列(称为“tubes”),以允许单个队列服务器充当各种工作者的集线器。Phalcon很容易支持。
查看服务器上可用的管道(tubes),并选择要使用的队列对象的管道:
```php
<?php
$tube_array = $queue->listTubes();
$queue->choose('myOtherTube');
```
使用`$queue`的所有后续工作现在都会操作`myOtherTube`而不是默认值`default`。您也可以查看队列使用的管道。
您也可以查看队列使用的管道。
```php
<?php
$current_tube = $queue->listTubeUsed();
```
### 管道操作
如果需要,可以暂停和恢复管。下面的示例暂停`myOtherTube` 3分钟。
```php
<?php
$queue->pauseTube('myOtherTube', 180);
```
将延迟设置为0将恢复正常操作。
```php
<?php
$queue->pauseTube('myOtherTube', 0);
```
### 服务器状态
您可以获得有关整个服务器或特定管的信息。
```php
<?php
$server_stats = $queue->stats();
$tube_stats = $queue->statsTube('myOtherTube');
$server_status = $queue->readStatus();
```
### Job 管理
Beanstalkd支持管理作业的能力,既可以延迟作业,也可以从队列中删除作业以供以后处理。
埋葬作业通常用于处理可以解决worker进程以外的潜在问题。这需要完成工作并将其放入埋葬队列中。
```php
<?php
$job = $queue->reserve();
$job->bury();
```
埋藏作业列表存储在服务器上。您可以检查队列中的第一个埋藏作业。
```php
<?php
$job_data = $queue->peekBuried();
```
如果埋藏队列为空,则返回false,否则返回Job对象。
你可以将第一个[N]埋藏的作业踢到埋藏的队列中,将它们放回就绪队列中。下面是踢开前三个埋葬作业的例子。
```php
<?php
$queue->kick(3);
```
可以完成将作业释放回就绪队列以及可选的延迟。这对于处理作业时的瞬态错误很方便。以下是在作业上放置低(100)优先级和3分钟延迟的示例。
```php
<?php
$job = $queue->reserve();
$job->release(100, 180);
```
优先级和延迟与将作业`put`队列时相同。
使用`jobPeek($job_id)`可以完成检查队列中的作业。下面的示例试图查看作业ID 5。
```php
<?php
$queue->jobPeek(5)
```
已删除的作业无法检查并返回false。就绪,隐藏和延迟作业将返回Job对象。
### 进一步阅读
[协议文本](https://github.com/kr/beanstalkd/blob/master/doc/protocol.txt) 包含BeanstalkD的所有内部操作细节,通常被认为是BeanstalkD的实际文档。
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持