內容目录

上一个主题

运行环境

下一个主题

服务列表

实现后台进程和后台任务

后台进程

应用可以通过应用代码根目录下的 Procfile 文件指定运行的后台进程。

Procfile 文件每一行声明一条需要运行的后台进程,格式如下:

name: command

name 为后台进程名, command 为启动后台进程的命令。

下面是一个 Python 应用启动一个后台任务进程的配置信息:

worker: python vendor/rq/cli.py worker

或者当使用 PHP 时:

worker: php daemon.php

在代码提交后,你可以在『应用/后台进程』页面看到所有后台进程的运行状态,进程刚创建时默认只会运行一个实例,你可以根据需要来增加实例数。

../../_images/background-process-management.png

使用PHP-Resque实现后台任务

php-resque 是一个基于 Redis 的队列库,是 resque 项目的 PHP Fork 版本。

安装

使用 php-resque 之前,需要先安装,可以使用 composer 进行。如果当前系统中没有 composer,可以参考 使用 Composer 管理依赖库 安装。

$ composer require sinacloud/php-resque:dev-master
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing colinmollenhour/credis (1.7)
    Loading from cache

  - Installing psr/log (1.0.0)
    Loading from cache

  - Installing chrisboulton/php-resque (dev-master 73b62e3)
    Cloning 73b62e364a89230d041abd2ba767bcec6fa15927

Writing lock file
Generating autoload files

将 vendor 目录和应用代码一起提交入代码仓库,即可在服务端的代码里使用 php-resque 了。

添加任务描述类

创建一个 job.php 文件,这个文件里定义需要运行的任务。

<?php

class My_Job
{
    public function perform()
    {
        // Work work work
        echo $this->args['name'];
    }
}

创建后台工作进程

创建一个 worker.php 文件,这个模块会监听 Redis 队列并处理任务。

<?php

date_default_timezone_set('Asia/Shanghai');
$redis = "redis 连接地址";
require 'job.php';
putenv("QUEUE=default");
putenv("REDIS_BACKEND=$redis");
require 'vendor/bin/resque';

在应用代码根目录下创建一个 Procfile 文件,如下添加一个新的后台进程。

worker: php worker.php

添加任务

在 Web 应用程序的处理函数中,使用如下代码添加任务。

<?php

require 'vendor/autoload.php';
$redis = "redis 连接地址";
Resque::setBackend($redis);
$args = array(
    'name' => 'Chris'
);
Resque::enqueue('default', 'My_Job', $args);

执行完 enqueue 后,任务就会被添加到 Redis 队列中去异步执行,后台进程会不停的从 Redis 队列中取出任务并执行。

部署

将上面的代码提交入代码仓库并 push 到服务端,ta-dah! 完成。你可以在『应用/后台进程』页面来重启或者调整进程数目。如果进程启动有问题,你可以在 HTTP 错误日志里看到后台进程的详细错误日志来解决问题。