原文:https://blog.51cto.com/laok8/2107892?source=drh

业务逻辑介绍:

  1. 用户在 APP 上发帖子,然后存储到 Redis 的 List 列表中
  2. 利用 Linux 的 crontab 定时任务功能,按秒请求执行PHP脚本文件(processNewsRedisList.php)
  3. 调用 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;
if ($this->_model->news_publish($data)) {
return true;
} esle {
return false;
}
} public function news_publish( $data )
{ try{
return M('news')->add($data);
}catch(Exception $ex){
return FALSE;
}
}

PHP多进程开发与Redis结合实践的更多相关文章

  1. Redis进阶实践之七Redis和Lua初步整合使用(转载 7)

    Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...

  2. Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)

    Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  3. Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装(转载)(1)

    Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇 ...

  4. Redis进阶实践之十三 Redis的Redis-trib.rb文件详解

    一.简介     事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要.redis-trib.rb是redis官方推出的管理re ...

  5. Redis进阶实践之十六 Redis大批量增加数据

    一.介绍      有时,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档的目标是提供有关如何以尽可能快的速度向Redis提 ...

  6. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

  7. Redis进阶实践之十三 Redis的Redis-trib.rb脚本文件使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8484784.html 一.简介 事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的 ...

  8. Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)

    Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...

  9. Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)

    Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...

随机推荐

  1. python matplotlib动态绘图

    matplotlib animation的官方文档: http://matplotlib.org/api/animation_api.html 接下来完成一个实时获取cpu数值,并绘图的功能. 1.动 ...

  2. Redis 学习-Redis Sentinel

    一.启动服务 1. 配置文件 sentinel.conf daemonize yes # 是否守护进程启动 pidfile "/var/run/redis-sentinel-26379.pi ...

  3. m3u8系列(一)练手spider

    本次目标 http://www.qiqi.la/vod-detail-id-46194.html 目的,down魔道祖师,实现 前期分析文件得到以下粗略步骤 1 进入二级页面,找到 <ifram ...

  4. Image Processing and Analysis_15_Image Registration:Mutual-Information-Based Registration of Medical Survey——2003

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  5. H265编码等级以及图像的基础知识

    1. H265编码等级 H264编码profile & level控制 .H265编码初探 H265 profile H265 Profile & Level & Tier 介 ...

  6. SpringMVC返回void的三大方法

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 在是springMVC的void的返回值中,有三大方法可以运行,个人觉得 ...

  7. Java基础 使用转换流进行文件的复制 / RandomAccessFile 类进行文件的复制

    笔记:  **使用转换流进行文件的复制 文本文件---字节流FileInputStream--> [InputStreamReader] -----字符流BufferedReader------ ...

  8. Beyond Compare 4提示已经过了30天试用期

    打开Beyond Compare 4,提示已经超出30天试用期限制,解决方法:1.修改C:\Program Files\Beyond Compare 4\BCUnrar.dll ,这个文件重命名或者直 ...

  9. Nginx防盗链模块ngx_http_referer_module

    ngx_http_referer_module⽤用来阻⽌止Referer⾸首部⽆无有效值的请求访问,可防⽌止盗链指令:12.1 valid_referers定义 referer ⾸首部的合法可⽤用值, ...

  10. fsLayuiPlugin富文本编辑器使用(layedit)

    富文本编辑器基于layedit实现.演示地址:http://fslayui.itcto.cn 富文本编辑器使用 必须使用textarea标签 id必须定义 必须定义样式fsLayedit 可以通过he ...