队列
最后更新于:2022-04-02 05:14:12
[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
'192.168.0.21',
'port' => '11300',
]
);
// 将作业插入队列中
$queue->put(
[
'processVideo' => 4871,
]
);
```
可用的连接选项包括:
| 选项 | 描述 | 默认 |
| ------ | ---------------------------------------- | --------- |
| host | beanstalk服务器所在的IP | 127.0.0.1 |
| port | 连接端口 | 11300 |
在上面的例子中,我们存储了一条消息,允许后台作业处理视频。消息立即存储在队列中,没有一定的生存时间。
其他选项如:运行时间,优先级和延迟可以作为第二个参数传递:
```php
put(
[
'processVideo' => 4871,
],
[
'priority' => 250,
'delay' => 10,
'ttr' => 3600,
]
);
```
可以使用以下选项:
| 选项 | 描述 |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| priority | 它是一个整数<2 ** 32。具有较小优先级值的作业将在具有较大优先级的作业之前安排。最紧急的优先事项是0;最紧急的优先事项是4,294,967,295。|
| delay | 在将作业放入就绪队列之前等待的整数秒。在此期间,工作将处于“延迟”状态。 |
| ttr | 运行时间 - 允许工作人员运行此作业的整数秒。这个时间从工人保留这项工作的那一刻算起。 |
放入队列的每个作业都会返回一个`job id`,您可以使用该ID来跟踪作业的状态:
```php
put(
[
'processVideo' => 4871,
]
);
```
## 检索消息
将作业放入队列后,后台工作人员可以使用这些消息,这些消息将有足够的时间来完成任务:
```php
peekReady()) !== false) {
$message = $job->getBody();
var_dump($message);
$job->delete();
}
```
必须从队列中删除作业以避免双重处理。如果实现了多个后台作业worker,则必须`reserved` 作业,以便其他worker进程不会重新处理它们,而其他worker进程则保留它们:
```php
reserve()) !== false) {
$message = $job->getBody();
var_dump($message);
$job->delete();
}
```
我们的客户端实现了Beanstalkd提供的一组基本功能,但足以允许您构建实现队列的应用程序。
## 高级主题
### 多个队列
Beanstalkd支持多个队列(称为“tubes”),以允许单个队列服务器充当各种工作者的集线器。Phalcon很容易支持。
查看服务器上可用的管道(tubes),并选择要使用的队列对象的管道:
```php
listTubes();
$queue->choose('myOtherTube');
```
使用`$queue`的所有后续工作现在都会操作`myOtherTube`而不是默认值`default`。您也可以查看队列使用的管道。
您也可以查看队列使用的管道。
```php
listTubeUsed();
```
### 管道操作
如果需要,可以暂停和恢复管。下面的示例暂停`myOtherTube` 3分钟。
```php
pauseTube('myOtherTube', 180);
```
将延迟设置为0将恢复正常操作。
```php
pauseTube('myOtherTube', 0);
```
### 服务器状态
您可以获得有关整个服务器或特定管的信息。
```php
stats();
$tube_stats = $queue->statsTube('myOtherTube');
$server_status = $queue->readStatus();
```
### Job 管理
Beanstalkd支持管理作业的能力,既可以延迟作业,也可以从队列中删除作业以供以后处理。
埋葬作业通常用于处理可以解决worker进程以外的潜在问题。这需要完成工作并将其放入埋葬队列中。
```php
reserve();
$job->bury();
```
埋藏作业列表存储在服务器上。您可以检查队列中的第一个埋藏作业。
```php
peekBuried();
```
如果埋藏队列为空,则返回false,否则返回Job对象。
你可以将第一个[N]埋藏的作业踢到埋藏的队列中,将它们放回就绪队列中。下面是踢开前三个埋葬作业的例子。
```php
kick(3);
```
可以完成将作业释放回就绪队列以及可选的延迟。这对于处理作业时的瞬态错误很方便。以下是在作业上放置低(100)优先级和3分钟延迟的示例。
```php
reserve();
$job->release(100, 180);
```
优先级和延迟与将作业`put`队列时相同。
使用`jobPeek($job_id)`可以完成检查队列中的作业。下面的示例试图查看作业ID 5。
```php
jobPeek(5)
```
已删除的作业无法检查并返回false。就绪,隐藏和延迟作业将返回Job对象。
### 进一步阅读
[协议文本](https://github.com/kr/beanstalkd/blob/master/doc/protocol.txt) 包含BeanstalkD的所有内部操作细节,通常被认为是BeanstalkD的实际文档。
';