[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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持