redis实现消息队列教程

redis实现消息队列教程(ps:这个消息队列因为是每秒插入一次数据 对于实时性比较高的就不要用消息队列了 就是直接插入数据库)

第一步:读取redis队列 并且存入数据库 后再移除 代码如下



<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/10/18
 * Time: 17:00
 */

file_put_contents('log.log', date("Y-m-d H:i:s") . " " . var_export('测试每秒请求', TRUE) . PHP_EOL, FILE_APPEND | LOCK_EX);
require_once 'queenchuli/common/mysql.php';

redisc('tutorial-list',99,'mobantestinfo');


/**
 * @param $key redis key
 * @param $percount 一次性操作多少数据
 * @param $table  要插入的数据库
 */
function redisc($key,$percount,$table){

    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->auth('zhiweiredis');

    $arList = $redis->lrange($key, 0, $percount);

    if(!empty($arList)){
        foreach ($arList as $k=>$v){
            $arList[$k]=json_decode($v,true);
        }
        for ($i = 0; $i < $percount; $i++) {
            $redis->rPop($key);
        }
        $db = new mysql();
        $isOk=inserts($arList, $table);
        if ($isOk==1) {

        } else {
            //如果失败 就记录sql语句
            file_put_contents('/data/web/mircoweb/wwwroot/Public/queenchuli/moban/log.log', date("Y-m-d H:i:s") . " " . var_export($isOk, TRUE) . PHP_EOL, FILE_APPEND | LOCK_EX);
        }
    }
}


/**
 * 插入数组记录的操作
 * @param array $array
 * @param string $table
 * @return boolean
 */
function inserts($array, $table)
{

    $i = 0;
    $arraynew=array();
    foreach ($array as $k => $v) {
        if ($i == 0) {
            //运行一次就可以了
            $keys = join(',', array_keys($v));
        }

        $val='('.join(',',$v).')';
        $arraynew[]=$val;
        $i++;
    }

    $values = join(',',$arraynew);
    $sql = "insert {$table}({$keys}) VALUES {$values}";

    $res = mysql_query($sql);
    if ($res) {
        return 1;
    } else {
        return $sql;
    }
}


// some code

?>

第二步 shell脚本写定时器每秒触发 这个PHP文件

    step=1 #间隔的秒数,不能大于60  
      
    for (( i = 0; i < 60; i=(i+step) )); do  
        $(php '/home/wwwroot/default/wordpress/cronb.php')  
		echo i
        sleep $step  
    done  
      
    exit 0  

保存为crontab.sh

然后sh运行它就是了 测试下 是不是有了 每次redis有新数据 都会插入数据库后 然后移除

HP QR Code源码分析

HP QR Code下载和使用方法如下
http://newmiracle.cn/?p=85

找到Common/phpqrcode.php 这个文件
找到QRimage类的 image函数 生成图片的核心逻辑就在这个函数

 /**
         * @param $frame  二进制信息的数组
         * @param int $pixelPerPoint 每个二进制数字生成的大小
         * @param int $outerFrame 二维码外间距的白色
         * @return resource
         */

        private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) 
        {

            $h = count($frame);
            $w = strlen($frame[0]);

            $imgW = $w + 2*$outerFrame;
            $imgH = $h + 2*$outerFrame;


            $base_image =ImageCreate($imgW, $imgH);

            $col[0] = ImageColorAllocate($base_image,255,255,255);
            $col[1] = ImageColorAllocate($base_image,0,0,0);
            $col[2] = ImageColorAllocate($base_image,255,0,0);

            imagefill($base_image, 0, 0, $col[0]);


            //循环遍历二进制信息 1代表黑色 这个地方就可以自定义颜色
            for($y=0; $y<$h; $y++) {
                for($x=0; $x<$w; $x++) {
                    if ($frame[$y][$x] == '1') {
                        ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[2]);
                    }
                }
            }

            $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
            //重新给图片设置大小
            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
            ImageDestroy($base_image);

            return $target_image;
        }

下面个版本是自定义图片哦
private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
{

$h = count($frame);
$w = strlen($frame[0]);

$imgW = $w*5 + 2*$outerFrame;
$imgH = $h*5 + 2*$outerFrame;

$base_image =ImageCreate($imgW, $imgH);

$col[0] = ImageColorAllocate($base_image,255,255,255);
$col[1] = ImageColorAllocate($base_image,0,0,0);
$col[2] = ImageColorAllocate($base_image,255,0,0);

imagefill($base_image, 0, 0, $col[0]);

//循环遍历二进制信息 1代表黑色 这个地方就可以自定义图片 左上 右上 左下因为要保持纯色 不能替换图片
$image1 = imagecreatefromjpeg(__DIR__.’/huaduo.jpg’);
$image2 = imagecreatefromjpeg(__DIR__.’/huaduo1.jpg’);
for($y=0; $y<$h; $y++) { for($x=0; $x<$w; $x++) { if ($frame[$y][$x] == '1') { if($x>7 && $x<33){ imagecopymerge($base_image, $image1, $x*5+$outerFrame, $y*5+$outerFrame, 0, 0, 5, 5, 100); }else if($y>7 && $y<33){ imagecopymerge($base_image, $image1, $x*5+$outerFrame, $y*5+$outerFrame, 0, 0, 5, 5, 100); }else if($x>30 && $y>30){
imagecopymerge($base_image, $image1, $x*5+$outerFrame, $y*5+$outerFrame, 0, 0, 5, 5, 100);
}else{
imagecopymerge($base_image, $image2, $x*5+$outerFrame, $y*5+$outerFrame, 0, 0, 5, 5, 100);
}

// ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
}
}
}

return $base_image;

}

swoole学习笔记第三季

ps:每次PHP 运行swoole的时候 都是把代码写入内存然后执行 每次执行的都是内存里的代码 所以 每次改完以后 需要重新PHP执行 从存储中写入内存执行

以下代码就是 swoole收到的数据存入redis缓存
on(‘open’, function ($ws, $request) {
foreach($ws->connections as $fd)
{
$ws->push($request->fd, “hello, welcome1\n”);

}
//获取连接总数
echo ‘获取所有链接数’.count($ws->connections).’\n’;
});

//监听WebSocket消息事件
$ws->on(‘message’, function ($ws, $frame) {
echo “Message: {$frame->data}\n”;

//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect(‘127.0.0.1’, 6379);
echo “Connection to server sucessfully”;
//存储数据到列表中
$redis->lpush(“tutorial-list”, “Redis”);
$redis->lpush(“tutorial-list”, “Mongodb”);
$redis->lpush(“tutorial-list”, “Mysql”);
// 获取存储的数据并输出
$arList = $redis->lrange(“tutorial-list”, 0 ,5);
echo “Stored string in redis”;
var_dump($arList);

$ws->push($frame->fd, “server: {$frame->data}”);
});

//监听WebSocket连接关闭事件
$ws->on(‘close’, function ($ws, $fd) {
echo “client-{$fd} is closed\n”;
});

$ws->start();

swoole学习笔记第二季

第一部分定时器写法

swoole_timer_tick函数就相当于setInterval,是持续触发的
swoole_timer_after函数相当于setTimeout,仅在约定的时间触发一次
swoole_timer_tick/swoole_timer_after函数会返回一个整数,表示定时器的ID
可以使用 swoole_timer_clear 清除此定时器,参数为定时器ID 说明客户端断开连接不会影响定时器

<?php

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "hello, welcome\n");
});

//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, "server: {$frame->data}");
});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});




//定时器要写在WorkerStart这个里面哦
$ws->on('WorkerStart', function ($serv, $worker_id){
    //3000ms后执行此函数
    $aaa=swoole_timer_tick(2000, function ($timer_id) {
        echo "tick-2000ms\n";
    });
    echo $aaa.'\n';
   //清除定时器
//    swoole_timer_clear($aaa);
});

$ws->start();

使用迭代器遍历Server所有连接

<?php

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    foreach($ws->connections as $fd)
    {
        $ws->push($request->fd, "hello, welcome1\n");

    }
    //获取连接总数
    echo '获取所有链接数'.count($ws->connections).'\n';
});


//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, "server: {$frame->data}");
});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});


$ws->start();



swoole学习笔记第一季

首先swoole是自己开发的web服务器 跟apache和nginx无关

1 首先开启端口 并且监听9502这个端 是否有客户端请求这个端口 ps:这里讲的是websocket 因为方便测试
//创建websocket服务器对象,监听0.0.0.0:9502端口

<!--?php //创建websocket服务器对象,监听0.0.0.0:9502端口 端口号可以自定义哦 $ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件 $ws-&gt;on('open', function ($ws, $request) {
    var_dump($request-&gt;fd, $request-&gt;get, $request-&gt;server);
    $ws-&gt;push($request-&gt;fd, "hello, welcome\n");
});

//监听WebSocket消息事件
$ws-&gt;on('message', function ($ws, $frame) {
    echo "Message: {$frame-&gt;data}\n";
    $ws-&gt;push($frame-&gt;fd, "server: {$frame-&gt;data}");
});

//监听WebSocket连接关闭事件
$ws-&gt;on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws-&gt;start();
&lt;/pre&gt;
&lt;p&gt;然后php 运行这个代码 就开启了端口&lt;br ?-->
netstat -ntlp 查看端口 就有了
tcp        0      0 0.0.0.0:9502                0.0.0.0:*                   LISTEN      10328/php

第二部分 客户端websocket请求


WebSocket Test
<script language="javascript" type="text/javascript">
    var wsUri = "ws://ip:9502";
    var output;

    var ws = new WebSocket(wsUri);
    //请求服务端后 成功后触发
    ws.onopen = function () {
        console.log('open');

        ws.send('hello');

    };

    ws.onmessage = function (evt) {

        console.log(evt.data)

    };
    //我关闭服务的时候 就会触发
    ws.onclose = function (evt) {

        console.log('WebSocketClosed!');

    };

    ws.onerror = function (evt) {

        console.log('WebSocketError!');

    };
</script>

输出结果

 

qq%e6%88%aa%e5%9b%be20161018105001

phpredis函数使用方法详解

phpredis函数文档详解

连接到 redis 服务

<?php
    //连接本地的 Redis 服务
   $redis = new Redis();
   $redis->connect('127.0.0.1', 6379);
   echo "Connection to server sucessfully";
         //查看服务是否运行
   echo "Server is running: " . $redis->ping();

//输出结果
Connection to server sucessfully
Server is running: PONG
?>

Redis set函数

<?php
   //连接本地的 Redis 服务
   $redis = new Redis();
   $redis->connect('127.0.0.1', 6379);
$redis->flushAll();
   echo "Connection to server sucessfully";
   //设置 redis 字符串数据
   $redis->set("tutorial-name", "Redis tutorial");
   // 获取存储的数据并输出
   echo "Stored string in redis:: " . $redis->get("tutorial-name");

  //输出结果
Connection to server sucessfully
Stored string in redis:: Redis tutorial
?>

Redis lpush函数

<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//每次运行清除redis所有缓存数据
$redis->flushAll();
//存储数据到列表中(可以想象上车  从前门一个个进入 所以先进入的都是排在后面)
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
$redis->lpush("tutorial-list", "c++");
$redis->lpush("tutorial-list", "php");
// 获取存储的数据并输出
$arList = $redis->lrange("tutorial-list", 0 ,2);

print_r($arList);

//结果 读取了0到2的范围
Array
(
    [0] => php
    [1] => c++
    [2] => Mysql
)

?>

Redis keys函数

<?php
   //连接本地的 Redis 服务
   $redis = new Redis();
   $redis->connect('127.0.0.1', 6379);
$redis->flushAll();
//存储数据到列表中
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
$redis->lpush("tutorial-list", "c++");
$redis->lpush("tutorial-list", "php");

   // 获取数据并输出
   $arList = $redis->keys("*");
   echo "Stored keys in redis:: ";
   print_r($arList);

  //输出结果 返回了 所有key
 Stored keys in redis:: Array ( [0] => tutorial-list ) 
?>