实现后台进程和后台任务¶
后台进程¶
应用可以通过应用代码根目录下的 Procfile
文件指定运行的后台进程。
Procfile
文件每一行声明一条需要运行的后台进程,格式如下:
name: command
name 为后台进程名, command 为启动后台进程的命令。
下面是一个 Python 应用启动一个后台任务进程的配置信息:
worker: python vendor/rq/cli.py
或者当使用 PHP 时:
worker: php daemon.php
在代码提交后,你可以在『应用/后台进程』页面看到所有后台进程的运行状态,进程刚创建时默认只会运行一个实例,你可以根据需要来增加实例数。
使用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 错误日志里看到后台进程的详细错误日志来解决问题。