ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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的实际文档。