队列(Queueing)

Activities like processing videos, resizing images or sending emails aren’t suitable to be executed online or in real time because it may slow the loading time of pages and severely impact the user experience.

The best solution here is to implement background jobs. The web application puts jobs into a queue and which will be processed separately.

While you can find more sophisticated PHP extensions to address queueing in your applications like RabbitMQ; Phalcon provides a client for Beanstalk, a job queueing backend inspired by Memcache. It’s simple, lightweight, and completely specialized for job queueing.

注意

Some of the returns from queue methods require that the module Yaml be installed. Please refer to http://php.net/manual/book.yaml.php for more information. For PHP < 7, Yaml 1.3.0 is acceptable. For PHP >= 7, you will need to use Yaml >= 2.0.0.

将任务加入队列(Putting Jobs into the Queue)

After connecting to Beanstalk you can insert as many jobs as required. You can define the message structure according to the needs of the application:

  1. <?php
  2. use Phalcon\Queue\Beanstalk;
  3. // Connect to the queue
  4. $queue = new Beanstalk(
  5. [
  6. "host" => "192.168.0.21",
  7. "port" => "11300",
  8. ]
  9. );
  10. // Insert the job in the queue
  11. $queue->put(
  12. [
  13. "processVideo" => 4871,
  14. ]
  15. );

Available connection options are:

OptionDescriptionDefault
hostIP where the beanstalk server is located127.0.0.1
portConnection port11300

In the above example we stored a message which will allow a background job to process a video. The message is stored in the queue immediately and does not have a certain time to live.

Additional options as time to run, priority and delay can be passed as second parameter:

  1. <?php
  2. // Insert the job in the queue with options
  3. $queue->put(
  4. [
  5. "processVideo" => 4871,
  6. ],
  7. [
  8. "priority" => 250,
  9. "delay" => 10,
  10. "ttr" => 3600,
  11. ]
  12. );

The following options are available:

OptionDescription
priorityIt’s an integer < 2**32. Jobs with smaller priority values will be scheduled before jobs with larger priorities. The most urgent priority is 0; the least urgent priority is 4,294,967,295.
delayIt’s an integer number of seconds to wait before putting the job in the ready queue. The job will be in the “delayed” state during this time.
ttrTime to run – is an integer number of seconds to allow a worker to run this job. This time is counted from the moment a worker reserves this job.

Every job put into the queue returns a “job id” which you can use to track the status of the job:

  1. <?php
  2. $jobId = $queue->put(
  3. [
  4. "processVideo" => 4871,
  5. ]
  6. );

检索信息(Retrieving Messages)

Once a job is placed into the queue, those messages can be consumed by a background worker which will have enough time to complete the task:

  1. <?php
  2. while (($job = $queue->peekReady()) !== false) {
  3. $message = $job->getBody();
  4. var_dump($message);
  5. $job->delete();
  6. }

Jobs must be removed from the queue to avoid double processing. If multiple background jobs workers are implemented, jobs must be “reserved” so other workers don’t re-process them while other workers have them reserved:

  1. <?php
  2. while (($job = $queue->reserve()) !== false) {
  3. $message = $job->getBody();
  4. var_dump($message);
  5. $job->delete();
  6. }

Our client implement a basic set of the features provided by Beanstalkd but enough to allow you to build applications implementing queues.