PHP多进程开发与Redis结合实践
原文:https://blog.51cto.com/laok8/2107892?source=drh
业务逻辑介绍:
- 用户在 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;
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结合实践的更多相关文章
- Redis进阶实践之七Redis和Lua初步整合使用(转载 7)
Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)
Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...
- Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装(转载)(1)
Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇 ...
- Redis进阶实践之十三 Redis的Redis-trib.rb文件详解
一.简介 事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要.redis-trib.rb是redis官方推出的管理re ...
- Redis进阶实践之十六 Redis大批量增加数据
一.介绍 有时,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档的目标是提供有关如何以尽可能快的速度向Redis提 ...
- Redis进阶实践之十八 使用管道模式加速Redis查询
一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...
- Redis进阶实践之十三 Redis的Redis-trib.rb脚本文件使用详解
转载来源:http://www.cnblogs.com/PatrickLiu/p/8484784.html 一.简介 事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的 ...
- Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)
Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...
- Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务(转载6)
Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务 一.引言 今天本来没有打算写这篇文章,但是,今天测试Redis的时候发现了两个问题 ...
随机推荐
- 如何画svg路径图
在画路径图之前,首先得在package.json引入2个依赖 废话不多说,直接上代码 <style> .green { position: absolute; } .blue { posi ...
- js对象转数组
1.Array.from() 方法,用于数组的浅拷贝.就是将一个类数组对象或者可遍历对象转换成一个真正的数组.eg: let obj = { 0: ‘nihao‘, 1: ‘haha‘, 2: ‘ga ...
- Image Processing and Analysis_21_Scale Space:Scale-space theory A basic tool for analysing structures at different scales——1994
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- 爬虫的新模块pyppeteer的使用
安装 python3 -m pip install pyppeteer 最好是py3.5+ 手动安装 你懂的,天朝网络环境很复杂,如果要用pyppeteer自己绑定的chromium,半天都下载不下来 ...
- 部署logstash节点
.部署Logstash节点 1.查看系统环境: [root@Logstash ~]# hostname Logstash [root@Logstash ~]# cat /etc/redhat-rele ...
- Windows Dialog对话框
一.MessageBox弹出框 MessageBox.Show(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon ...
- springboot2.0入门(六)-- ymal语法、数据校验
一.基本使用 1.ymal语法是一种更符合人类命名习惯的语法: # 1. 一个家庭有爸爸.妈妈.孩子. # 2. 这个家庭有一个名字(family-name)叫做“happy family” # 3. ...
- 1、概述&应用场景
1.概述&应用场景 Java反射机制是在运行状态中,对于任意一个类(Class)文件,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信 ...
- 21、自动装配-@Resource&@Inject
21.自动装配-@Resource&@Inject Spring 还支持使用@Resource(JSR250)和@Inject(JSR330)[Java规范的注解] AutowiredAnno ...
- Chrome浏览器设置自动启用Flash插件
Chrome浏览器设置自动启用Flash插件 1.打开Chrome浏览器,输入chrome://flags/#run-all-flash-in-allow-mode,打开,找到Enable Eph ...