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的时候发现了两个问题 ...
随机推荐
- Linux的关机和重启命令
Linux有如下的关机和重启命令:shutdown, reboot, halt, poweroff,那么它们有什么区别呢? shutdown - 建议使用的命令 shutdown是最常用也是最安全的关 ...
- stm32 printf重定向
printf函数调用fputc int fputc(int ch, FILE *p) { USART_SendData(USART1, ch); //重定向到串口 while(USART_GetFla ...
- Vue粒子特效(vue-particles插件)
` npm install vue-particles --save-dev ` ` import VueParticles from 'vue-particles' Vue.use(VueParti ...
- C#基础 冒泡排序
冒泡排序 依次比较相邻的两个数,将小数放在前面,大数放在后面. 对数组中两个变量进行交换,是冒泡排序中最基本的步骤 //数组中两个变量进行交换 ,,}; ]; s [] = s [s.Length-] ...
- IDEA 导入jar包
项IDEA的项目中导入下载好的jar包: 在intelij IDEA 中,点击File-Project Structure,出现界面的左侧点击Modules,然后点击“+”. 然后找到你要导入的jar ...
- Win10系统更新提示错误0xc1900403的解决方法
Win10系统自从发布上线以来,一直有不断地进行更新,而每次更新也给我们用户带来了大大小小不同的惊喜.但是近来一些用户反应说Win10系统更新一直失败,并出现0xc1900403的错误代码提示. 对于 ...
- strconv:各种数据类型和字符串之间的相互转换
介绍 strconv包实现了基本数据类型和其对应字符串之间的相互转换.主要有一下常用函数:Atoi,Itoa,Parse系列,Formart系列,Append系列 string和int之间的转换 这一 ...
- 【2017-12-06】winfrom 窗体自启最大化,控件自适应
先将窗体windowstate属性设置为Maximized public partial class Form1 : Form { public Form1() { InitializeCompone ...
- Python查看模块函数,查看函数方法的详细信息
Python查看方法的详情 1.通用的帮助函数help() 使用help()函数来查看函数的帮助信息. 如: import requests help(requests) 会有类似如下输出: 2.查询 ...
- cookies, session, token
Cookie 是由客户端(通常是浏览器)保存的小型文本信息,其内容是一系列的键值对,是由 HTTP 服务器设置并保存在浏览器上的信息. 在post请求的瞬间,cookie会被浏览器自动添加到请求头中. ...