Swoole

redis 缓存锁的实现方法

醉酒当歌 提交于 2020-08-15 08:03:55
1. redis加锁分类 redis能用的的加锁命令分表是INCR、SETNX、SET 2. 第一种锁命令 INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。 然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。 1、 客户端A请求服务器获取key的值为1表示获取了锁 2、 客户端B也去请求服务器获取key的值为2表示获取锁失败 3、 客户端A执行代码完成,删除锁 4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功 5、 客户端B执行代码完成,删除锁 $redis->incr($key); $redis->expire($key, $ttl); //设置生成时间为1秒 3. 第二种锁 SETNX 这种加锁的思路是,如果 key 不存在,将 key 设置为 value 如果 key 已存在,则 SETNX 不做任何动作 1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功 2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败 3、 客户端A执行代码完成,删除锁 4、 客户端B在等待一段时间后在去请求设置key的值,设置成功 5、 客户端B执行代码完成,删除锁 $redis->setNX($key,

mysql建立索引的原则

三世轮回 提交于 2020-08-14 13:46:53
1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。 2.为经常需要排序、分组和联合操作的字段建立索引 经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。 3.为常作为查询条件的字段建立索引 如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。 4.限制索引的数目 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。 5.尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。 6.尽量使用前缀来索引 如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。 7.删除不再使用或者很少使用的索引

封装php的RabbitMq

℡╲_俬逩灬. 提交于 2020-08-14 13:00:54
简单封装了一个rabbitmq类(业务代码随便写的) 首先是账号密码配置 config.php <?php return $arr = [ 'RabbitMq' => [ // Rabbitmq 服务地址 'host' => '127.0.0.1', // Rabbitmq 服务端口 'port' => '5672', // Rabbitmq 帐号 'login' => 'guest', // Rabbitmq 密码 'password' => 'guest', 'vhost'=>'/' ] ]; 基类 base.php <?php include dirname(__FILE__).'/object.php'; include dirname(__FILE__).'/config.php'; class RabbitMq implements object { //保存类实例的静态成员变量 static private $_instance; static private $_conn; static private $amp ; static private $route = 'key_1'; static private $q ; static private $ex ; static private $queue; public static function

Swoole 中毫秒定时器(Timer)的使用

安稳与你 提交于 2020-08-13 19:56:47
间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止。 $timer = Swoole\Timer::tick(3000, function (int $timer_id, $param1, $param2) { echo "timer_id #$timer_id, after 3000ms.\n"; echo "param1 is $param1, param2 is $param2.\n"; Swoole\Timer::tick(14000, function ($timer_id) { echo "timer_id #$timer_id, after 14000ms.\n"; }); }, "A", "B"); 一次性定时器,执行完成后会自动销毁。 $str = "Swoole"; $timer = Swoole\Timer::after(1000, function() use ($str) { echo "Hello, $str\n"; }); 使用定时器 ID 来删除定时器。 var_dump(Swoole\Timer::clear($timer)); 来源: oschina 链接: https://my.oschina.net/u/4396566/blog/4405953

Swoole 中使用 HTTP 异步服务器、HTTP 协程服务器

孤人 提交于 2020-08-13 08:42:46
HTTP 异步风格服务器 # http_server.php $http = new Swoole\Http\Server("0.0.0.0", 9501); // 设置服务器运行参数 $serv->set(array( 'daemonize' => 1, // 作为守护进程运行,需同时设置log_file 'log_file' => '/www/logs/swoole.log', // 指定标准输出和错误日志文件 )); // HTTP 服务器只需要监听 onRequest 事件 $http->on('request', function ($request, $response) { // 响应 favicon.ico 请求 if ($request->server['path_info'] == '/favicon.ico' || $request->server['request_uri'] == '/favicon.ico') { $response->end(); return; } var_dump($request->get, $request->post); // URL路由器 list($controller, $action) = explode('/', trim($request->server['request_uri'], '/')); if

Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器

时光总嘲笑我的痴心妄想 提交于 2020-08-13 04:57:52
WebSocket 异步风格服务器 WebSocket\Server 继承自 Http\Server ,所以 Http\Server 提供的所有 API 和配置项都可以使用。 # ws_server.php class WebSocket { public $server; public function __construct() { // 创建websocket服务器对象,监听0.0.0.0:9502端口 $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9502); // 设置服务器运行参数 $serv->set(array( 'daemonize' => 1, // 作为守护进程运行,需同时设置log_file 'log_file' => '/www/logs/swoole.log', // 指定标准输出和错误日志文件 )); // 监听WebSocket连接打开事件 $this->server->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $ws->push($request->fd, "hello, welcome\n"); }); //

Dockerfile编写制作centos7.7+php5.6+nginx镜像

依然范特西╮ 提交于 2020-08-13 02:51:52
1、新建一个dockerfile文件 touch test.Dockerfile 2、找一个centos基础镜像  可以去docker hub上寻找,链接: docker-hub  在搜索框搜索'centos',或者直接点击 docker-hub-centos 。里面有从centos 6 到最新的centos 8 等各版本的基础镜像,此处我选择版本:centos:7.7.1908,当然也可以选择其它版本。  所以,在test.Dockerfile第一行为: FROM centos:7.7.1908 3、MAINTAINER 指定作者 (非必要) MAINTAINER wu "471515***@qq.com" 4、使用RUN命令安装php5.6   因为我采用yum安装,所在需要先配置和更新yum源,然后再进行php5.6安装,。原本在centos的命令如下: yum install -y epel-release yum -y install wget wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7. repo rpm -ivh http: //rpms.famillecollet.com/enterprise/remi-release-7. rpm yum -y install -

安装phpize7.3

夙愿已清 提交于 2020-08-12 18:23:50
1,背景 在现有的ubuntu16.04中,装了好几个版本的PHP /etc/php/ 5.6/ 7.0/ 7.1/ 7.2/ 7.3/ whereis php php: /usr/bin/php7.3 /usr/bin/php7.0 /usr/bin/php /usr/lib/php /etc/php /usr/include/php /usr/share/php7.3-bcmath /usr/share/php7.3-readline /usr/share/php7.3-zip /usr/share/php7.0-common /usr/share/php7.0-opcache /usr/share/php7.3-ldap /usr/share/php7.3-opcache /usr/share/php7.3-xml /usr/share/php7.3-mysql /usr/share/php7.3-json /usr/share/php7.3-gd /usr/share/php7.0-json /usr/share/php /usr/share/php7.3-curl /usr/share/php7.3-mbstring /usr/share/php7.0-mcrypt /usr/share/php7.3-common /usr/share/php7.0-readline

php使用shmop函数创建共享内存减少负载

落爺英雄遲暮 提交于 2020-08-12 09:55:22
PHP做内存共享有两套接口。一个是shm,它实际上是变量共享,会把对象变量序列化后再储存。使用起来倒是挺方便,但是序列化存储对于效率优先的内存访问操作而言就没啥意义了。另外一个是shmop,它是Linux和Windows通用的,不过功能上比shm弱了一些,在 Linux 上,这些函数直接是通过调用 shm* 系列的函数实现,而 Winodows 上也通过对系统函数的封装实现了同样的调用。 要创建共享内存段需要使用函数shmop,那么前提需要开启扩展。 shmop主要函数 shmop_open (创建或打开共享内存块)、shmop_write (向共享内存块中写入数据)、shmop_read (从共享内存块中读取数据)、shmop_size (获取共享内存块的大小)、shmop_close (关闭共享内存块)、shmop_delete (删除共享内存块) <?php //创建一块共享内存 $shm_key = 0x4337b101; $shm_id = @shmop_open($shm_key, 'c', 0644, 1024); //读取并写入数据 $data = shmop_read($shm_id, 0, 1024); shmop_write($shm_id, json_encode($data), 0); $size = shmop_size($shm_id); /

Swoole实现任务定时自动化调度详解,来学习下

余生颓废 提交于 2020-08-12 06:52:33
问题描述 这几天做银行对帐接口时,踩了一个坑,具体需求大致描述一下。 银行每天凌晨后,会开始准备昨天的交易流水数据,需要我们这边请求拿到。 因为他们给的是一个base64加密的zip压缩流,解开以后可以得到txt文件,里面就是我们需要的数据了。 业务程序写好以后,随手丢了一个定时任务就去睡觉了。 哪知道第二天上班的时候,检查。发现并没有拿到数据,查询一下日志的时候发现,凌晨服务端请求的时候,银行接口返回了:系统错误信息。 咨询银行那边后,银行那边相关人员建议我们多请求几次,但是在多次请求中,我发现银行那边是有频率限制的,最后得知,此接口只能半个小时才能请求一次。这就比较尴尬了,因为我不知道银行那边什么时候能返回数据给我。 于是这个问题怎么解决呢?理想的情况是,服务端请求数据,银行那边没有返回。然后程序等半个小时后,再请求一次,这样一直到银行那边返回正确的数据中止。 问题分析 这个功能换作别的语言也许不难,但是通过php实现的话,那就比较麻烦了。通常的话,我们可以搭配linux下的cron来实现,比如我们可以在凌晨到6:00之间做一个定时任务,每半个小时扫描一次php脚本,如果发现银行那边的状态依旧为失败的话,我们就执行一次php脚本去请求数据。直到请求到正确的数据,然后把状态更新为成功。 这不失为一种方法,但太傻了。比如说银行那边比较正常,凌晨,也就是第一次请求的时候