和get redis_Swoole中redis进程通信以及内存操作

336b6979b0860f1399c87ebbd5994304.png

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

9f5150df7b4ae375380137b7e39c8530.png

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下查询

进程通信

7fa509d54018f5da01f4ab952412cd10.png

第二个参数如果为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 = [
'百度一下,你就知道',
'新浪首页',
'腾讯首页',
'百度一下,你就知道',
'百度一下,你就知道',
'百度一下,你就知道'
];

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表的导入与导出


Swoole_table是一个基于共享内存和锁实现的超高性能,并发数据结构

$table = new swoole_table(1024);
//内存表增加一列
$table->column('id', $table::TYPE_INT, 4);
$table->column('name', $table::TYPE_STRING , 64);
$table->column('age', $table::TYPE_INT, 3);
$table->create();

//设置行的数据
$table->set('chuangxiang', [
'id' => 1,
'name' => 'chuangxiang',
'age' => 30,
]);

//另外一种设置行的数据
$table['chuangxiang2'] = [
'id' => 2,
'name' => 'shaoguan',
'age' => 35,
];

$table->incr('chuangxiang', 'age', 2); //增加
$table->decr('chuangxiang2', 'age', 2); //减少
$table->del('chuangxiang'); //删除
print_r($table->get('chuangxiang'));
print_r($table['chuangxiang2']);

上面的案例创建了一张内存表,内存一旦释放,内存表即消失
内存表用于共享很方便

协程(redis)

Swoole在2.0开始内置协程(Coroutine)的能力,提供了具备协程能力IO接口(统一在命名空间SwooleCoroutine*)。

开发者可以无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护。

  • 把普通功能的实现方式变成协程
  • 必须使用在onRequet,onReceive,onConnect回调中使用

$http = new Swoole_http_server('0.0.0.0', 8001);
$http->on('request', function($request, $response){
//获取redis里面的key的内容,然后输出浏览器
$redis = new SwooleCoroutineRedis();
$redis->connect('localhost', 6379);
$value = $redis->get($request->get['a']);
$response->header("Content-Type", "text/plain");
$response->end($value);
});
$http->start();

$request->get[‘a’] //获得通过地址带参传的值

e4c8be3cab3f17e36013c4f9d0a83909.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值