《四》PHP多进程开发与Redis结合实践

业务逻辑介绍:

  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;
        $this->_model->news_publish($data);
        return true;
    }

public function news_publish( $data )
{

        try{
            return M(‘news‘)->add($data);
        }catch(Exception $ex){
            return FALSE;
        }
    }

不足有误之处敬请指出,谢谢!

原文地址:http://blog.51cto.com/laok8/2107892

时间: 2024-10-10 02:34:08

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

Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装

原文:Redis进阶实践之一VMWare Pro虚拟机安装和Linux系统的安装 一.引言 设计模式写完了,相当于重新学了一遍,每次学习都会有不同的感受,对设计模式的理解又加深了,理解的更加透彻了.还差一篇关于设计模式的总结的文章了,写完这篇总结性的文章,设计模式的文章就暂时要告一段了,这篇总结性的文章我会尽快补上的.从今天开始,我就把我学习Redis的过程记录下载,以备以后查询观看.很久以前就接触过Redis,但是还没形成体系,最近有时间,就重新来学习一下,争取系统性的掌握Redis的各个方面

【Android开发-4】进入实践,最喜欢折腾的计算器

前言:前面对项目文件有了感性认识,接下来我们就需要通过不断实践,对项目的文件有理性的认识.以前折腾Unity3d.IOS开发都是拿计算器开刀,所以这次Android开发实践也不例外,继续拿计算器折腾.通过本人总结,你通过折腾计算器,可以学习掌握到对文本.按钮.输入框控件的事件监听触发和一些控件读写操作,编程语言可以接触到字符串的分割.拼接.查找等方法使用,还有if-else,switch控制语句的使用:总之通过操作一款简单的计算器,可以基本熟悉该开发环境下的流程和编程语言的使用. 首先展示下折腾

Redis进阶实践之十八 使用管道模式提高Redis查询的速度

原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前的解决方案大都是从官网上查找和翻译的,每个实例也都调试了,正确无误.把结果告诉我同事的时候,我也跟清楚这个主题如何操作了,里面的细节也更清楚了.大然也有人说可以通过脚本来做这个操作,没错,但是我对脚本语言还没有研究很透,就不来班门弄斧了. 二.管道的由来

Redis进阶实践之十一 Redis的Cluster集群搭建

原文:Redis进阶实践之十一 Redis的Cluster集群搭建 一.引言 本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的所涉及到的概念做深入的探讨.本文只是针对如何设置集群.测试和操作集群做了简述,并且从用户的角度描述了系统的行为,并不涉及Redis集群规范中所包含的细节.但是,本教程试图从最终用户的角度来解释有关Redis的Cluster集群的可用性和一致性的特点,并以简单易懂的方式讲解. 请注意,本教程需要使用Redis 3.0版本或更高版本. 如果您打算部署

2018-2019-2 20175105王鑫浩《Java程序设计》实验四 《Android开发基础》实验报告

实验四 <Android开发基础> 实验报告封面 课程:Java程序设计 班级:1751班 姓名:王鑫浩 学号:20175105 指导教师:王鑫浩 实验日期:2019年4月29日 实验时间:--- 实验序号:实验三 实验名称:敏捷开发与XP实践 实验要求 参考Android开发简易教程 完成云班课中的检查点,也可以先完成实验报告,直接提交.注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明.实验报告中一个检查点要有多张截图. 发表实验报告博客,标题"学期(如2018-20

后台开发 -- 核心技术与应用实践

后台开发 核心技术与应用实践 . C++编程常用技术 最好不要在头文件中使用命名空间,很容易造成命名冲突. strlen与sizeof的区别: strlen是函数,在运行时才能计算,传入参数是char*指针,返回字符串长度. sizeof()是运算符,而不是一个函数,在编译时就计算好了,用于计算数据空间的字节数. sizeof常用于返回类型和静态分配的对象.结构或数组所占用的空间,返回值跟内容无关. 在C++中,临时对象都是const类型的. 可以使用union(联合)判断系统是大端(big e

使用Bootstrap 3开发响应式网站实践04,使用Panels展示内容

在Bootstrap页面中,通常用Panels来展示主要功能的内容.该部分Html为: <div class="row" id="featureHeading"> <div class="col-md-12"> <h2>更多信息</h2> <p class="lead"> 广州恒大淘宝队的官方网站和微博同时发布了几张海报,预热本周三晚8点即将到来的亚冠1/4决赛第二回

PHP高性能开发-多进程开发

硬件多核时代的软件业以前计算能力的提升一直在摩尔定律的指引下,沿着提升CPU时钟频率这条道路前进,从初期的几十MHz到如今的几GHz.但是,进入2002年以 来,CPU提升主频的困难越来越大,因为主频的提升带来了散热和功耗的大幅增加等问题.几年前,英特尔和AMD都调整了研究方向,开始研究在同一CPU中 放置多个执行内核. 尽管多核是一种硬件技术,但硬件和软件是相互依存的,硬件只是一种物质基础,只有有了软件的支持,才能使硬件拥有用武之地.如今,多核的优势已成共识:一在于“降低功耗”,解决了以往靠主

[JAVA]十四种Java开发工具点评

作者:兄弟连 在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4