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的时候发现了两个问题 ...
随机推荐
- SQL将同样标识的查询结果查重并用逗号拼接
SELECT B.TaskID , LEFT(SamList, LEN(SamList) - 1) AS ResultListFROM ( SELECT TaskID , ( SELECT Sampl ...
- curl函数错误码对照信息表
- golang GC(二 定位)
前面已经介绍过golang的GC算法.要是我们的程序在运行是因为GC导致行能下降,该如何定位呢?说实话,工作中由于对go的gc问题不重视,根本没考虑过这个问题,今天特意来补补课.
- Aop动态代理和cglib
一般我们使用Aop对象时,常用动态代理模式,即是采用映射一个相同的类在此基础上进行前置后置操作. 动态代理多是采用原类实现父类接口,然后动态代理一个和原类相同的双胞胎兄弟类来实现映射. 父类 publ ...
- mesos-master启动失败,报错Failed to load unknown flag 'quorum.rpmsave'
[现象] mesos启动失败,查看mesos状态报错: [root@hps102 ~]# systemctl status mesos-master ● mesos-master.service - ...
- c# 运算符和表达式
- 【2017-07-03】CSS实现父级div透明,子集不透明。
父级背景色 background: rgba(0, 0, 0, 0.5);
- STM32窗口看门狗WWDG库函数的一点思考
WWDG当前计数器的值以及激活位和WWDG_CR这个寄存器相关.如下图所示: 而STM32f10x的库函数提供了两种设置WWDG_CR[0:6]位的方式. WWDG_SetCounter方法 #def ...
- PHP 获取上传文件的实际类型
方案一: mime_content_type ( string $filename ) : string (PHP 4 >= 4.3.0, PHP 5, PHP 7) mime_content_ ...
- 如何查看JVM的内存
学过java的人都知道,jvm是解释运行java的,java能够作为跨平台语言,也是因为jvm的存在,合理的使用jvm内存可以帮助程序很好的运行.那么,怎么查看jvm的内存使用情况呢,下面本文介绍一下 ...