Table of Contents

上一个主题

运行环境

下一个主题

服务列表

本页

实现后台进程和后台任务

后台进程

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

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

name: command

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

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

worker: python vendor/rq/cli.py

或者当使用 PHP 时:

worker: php daemon.php

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

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

使用Redis的list实现后台任务

list是 Redis 的一种数据结构,可以用来当作队列实现后台任务。

创建后台工作进程

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

<?php
$r = new Redis();
$r->connect('主机', '端口');
$r->auth('密码');
while(true){
    //从队列中取数据
    $string = $r->lPop('redis_list');
    //dosomething,本例中,实现将队列中的信息写入到mysql。
    if (!empty($string)) {
        $mysqli = new mysqli('地址', '用户名', '密码', '数据库', '端口');
        if ($mysqli->connect_error) {
            exit($mysqli->connect_error);
        }
        echo "connect ok";
        //往mysql中写入
        $sql = "insert into test(field) values('$string')";
        if($mysqli->query($sql) === TRUE){
            echo "新记录添加成功!";
        }else {
            echo "新记录添加失败,错误信息:" . $mysqli->error;
        }
        $mysqli->close();
    }
}
$r->close();

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

worker: php worker.php

添加任务

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

<?php

$r = new Redis();
$r->connect('主机', '端口');
$r->auth('密码');
//往队列中写数据
$r->lPush("redis_list", date('H:i:s'));

执行完 lPush 后,数据就会被添加到 Redis 队列中,后台进程会不停的从 Redis 队列中取出数据并进行您需要对该数据所做的处理。在本例中,数据取出后通过异步写入mysql,减少了网络请求时间。

部署

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