Swoole中使用redis以及进程通信

redis的使用

安装redis前先安装hiredis库

  1. 下载安装phpre dis,官网下载redis安装包
  2. 解压
  3. 进入目录后make

 进入src目录执行  ./redis-server 开启服务 默认端口为6379

可在根目录 redis.conf 下修改端口

客户端执行,./redis-cli

example:(其他命令参考官网手册)

set chuangxiang 77

get chuangxiang

安装phpredis

apt install git

1.下载phpredis扩展文件

git clone https://github.com/phpredis/phpredis.git

2.生成configure

cd [ ]     phpize

3.编译安装

./configure

make

make install

4.在php.ini中添加扩展

extension=redis.so


hiredis下载,在swoole手册中有下载地址

  1. 解压,unzip [xxx]
  2. make –j
  3. sudo make install

启动服务:

sudo  ldconfig


重新编译

在Swoole中使用redis需要重新编译,由于之前安装没有选择过多扩展,一般是会在一开始全部安装完成

进入swoole目录利用configure重新编译

  1. ./configure  --with-php-config=/home/work/study/soft/php/bin/php-config --enable-async-redis
  2. make clean
  3. make  –j
  4. sudo  make  install

//查看是否安装成功

php  –m
php  --ri  swoole


redis案例

使用前开启redis

$redisClient = new swoole_redis;
$redisClient->connect('localhost', 6379, function(swoole_redis $redisClient, $result) {
    echo "connect".PHP_EOL;
    var_dump($result);

    //同步 redis(new Redis())->set('key',2);
    $redisClient->set('chuangxiang_1', time(), function(swoole_redis $redisClient, $result){
        var_dump($result);
    });

});

echo "start".PHP_EOL;

读取部分值

$redisClient->get('chuangxiang_1', function(swoole_redis $redisClient, $result){
    var_dump($result);   
    $redisClient->close();
});

读取所有key值:(模糊获取)

获取键名而不是内容

$redisClient->keys('*g_*', function(swoole_redis $redisClient, $result){
    var_dump($result);
    redisClient->close();
});

可改为’*’获取全部键值

//相关命令可去redis官网/coommands下查询

进程通信

第二个参数如果为true,则在回调函数内输出不会到屏幕而是管道内

在进程内执行外部程序

$process = new swoole_process(function(swoole_process $pro){
//todo
//php redis.php
   $pro->exec("/home/work/study/soft/php/bin/php", [__DIR__.'/../server/http_server.php']);
}, false);

$pid = $process->start();
echo $pid.PHP_EOL;
swoole_process::wait();

新建process.php为一个父进程

echo "process-start-time:".date("Ymd H:i:s").PHP_EOL;
$workers = [];
$urls = [
    'http://baidu.com',
    'http://sina.com.cn',
    'http://qq.com',
    'http://baidu.com?search=chuangxiang',
    'http://baidu.com?search=shaoguan',
    'http://baidu.com?search=chaozhou'
];

for($i = 0; $i < 6; $i++){
    //子进程
    $process = new swoole_process(function(swoole_process $worker) use($urls, $i){
        //curl
        $content = curlData($urls[$i]);
        echo $content.PHP_EOL;
        //$worker->write($content.PHP_EOL);
    }, true);//输出到管道

    $pid = $process->start();
    $workers[$pid] = $process;
}

foreach ($workers as $process) {
    echo $process->read();//从管道之中读数据
}


/**
 * 模拟请求URL的内容 1s
 * @param $url
 * @return string
 */
function curlData($url){
    //curl file_get_contents
    sleep(1);
    return $url . "success".PHP_EOL;
}

echo "process-end-time:".date("Ymd H:i:s");

可以考虑应用在excle表的导入与导出

猜你喜欢

转载自blog.csdn.net/qq_36289732/article/details/82533073