业务逻辑介绍:
用户在 APP 上发帖子, 然后存储到 Redis 的 List 列表中
利用 Linux 的 crontab 定时任务功能, 按秒请求执行 PHP 脚本文件 (processNewsRedisList.php)
调用 redis_process 处理 API, 进行存储到 Mysql 中
1. 发帖子 API
- public function post_json() {
- $image = $_FILES['image'];
- $data = I();
- $images = $this->post_upload($image);
- $data['image'] = $images ? $images : '';
- if( count($data) ){
- $redis = new Redis();
- $data['creation_time'] = time();
- // 把发过来的帖子存储 redis
- $result = $redis->lpush('news_list', json_encode($data));
- // $redis->lpush('news_list', json_encode($data));
- // while (TRUE){
- // if ($redis->lsize('news_list')> 0){
- // $info = $redis->rpop('news_list');
- // $info = json_decode($info, true);
- // $result = $this->_model->news_publish( $info );
- // }else {
- // sleep(1);break;
- // }
- // }
- // $redis->close();
- $data['creation_time'] = time();
- // $result = $this->_model->news_publish( $data );
- if( $result <1 ){//redis 方式
- // if( !$result ){//model 方式
- $this->_data['data'] = '';
- $this->_data['error'] = true;
- $this->_data['message'] = L('_DATABASE_ERROR_');
- }else{//success
- $this->_data['data'] = $result;
- $this->_data['error'] = false;
- }
- }
- else{
- $this->_data['data'] = '';
- $this->_data['error'] = true;
- $this->_data['message'] = L('_Invalid_Parameters_');
- }
- $this->response($this->_data);
- }
- 2.processNewsRedisList.php
- php
- /**
- * 检查队列中帖子, 并把帖子插入数据库表中
- */
- function worker()
- {
- // 再次克隆出子进程
- $pid = pcntl_fork();
- if ( $pid == -1 ) {
- exit('fork error');
- }
- if ( $pid == 0 ) {
- $redis = new Redis();
- $redis->connect('127.0.0.1', 7200);
- // 业务逻辑代码
- while(true) {//sleep(5);
- if( $redis->lsize('news_list')> 0 ){
- $info = $redis->rpop('news_list');
- $info = json_decode($info, TRUE);
- // 使用 curl 调用 API 接口
- $uri = "http://*.*.*.*:*/api.zmartec/News/redis_process";
- $data = $info;
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $uri);
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_HEADER, 0);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
- $result = curl_exec($ch);
- curl_close($ch);
- } else {
- sleep(1);// 队列中没有任务的时候, 睡眠 1s, 让出 cpu 给其它进程
- }
- }
- $redis->close();
- }
- }
- /**
- * 子进程, 负责设置子进程为领导小组
- *
- * 并调用处理函数, 处理任务
- */
- function children()
- {
- $sid = posix_setsid();
- echo $sid;
- for( $i = 0; $i <2; $i++ ) {
- worker();
- }
- }
- // 克隆子进程, 返回子进程的进程 id
- $pid = pcntl_fork();
- if ( $pid == -1 ) {
- exit('fork error');
- }
- if ( $pid == 0 ) {
- children();
- }else{
- exit('parent exit');
- }
- ?>
3. 存储帖子到 Mysql
thinkphp 3.2 框架:
- public function redis_process()
- {
- $data = $_POST;
- $this->_model->news_publish($data);
- return true;
- }
- public function news_publish( $data )
- {
- try{
- return M('news')->add($data);
- }catch(Exception $ex){
- return FALSE;
- }
- }
不足有误之处敬请指出, 谢谢!
来源: http://www.bubuko.com/infodetail-2575176.html