实现后台进程和后台任务 ############################# .. include:: ../services/background-process.rst 使用Redis的list实现后台任务 =========================== list是 Redis 的一种数据结构,可以用来当作队列实现后台任务。 创建后台工作进程 ================== 创建一个 ``worker.php`` 文件,这个模块会监听 Redis 队列并处理任务。 .. code-block:: php 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 应用程序的处理函数中,使用如下代码添加任务。 .. code-block:: php connect('主机', '端口'); $r->auth('密码'); //往队列中写数据 $r->lPush("redis_list", date('H:i:s')); 执行完 lPush 后,数据就会被添加到 Redis 队列中,后台进程会不停的从 Redis 队列中取出数据并进行您需要对该数据所做的处理。在本例中,数据取出后通过异步写入mysql,减少了网络请求时间。 部署 =========== 将上面的代码提交入代码仓库并 push 到服务端,ta-dah! 完成。你可以在『应用/后台进程』页面来重启或者调整进程数目。如果进程启动有问题,你可以在 HTTP 错误日志里看到后台进程的详细错误日志来解决问题。