flock

高并发下,php与redis实现的抢购、秒杀功能

放肆的年华 提交于 2020-04-30 02:07:33
抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。 重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数 <? php $conn = mysqli_connect ("localhost","root","" ); if (! $conn ){ echo "connect failed" ; exit ; } mysqli_select_db ( $conn ,"ceshi" ); mysqli_query ( $conn ,"set names utf8" ); $price =10 ; $user_id =1 ; $goods_id =1 ; $sku_id =11 ; $number =1 ; // 生成唯一订单 function build_order_no(){ return date ('ymd'). substr ( implode ( NULL , array_map ('ord', str_split ( substr ( uniqid (), 7, 13), 1))

MySQL(表锁)、PHP(文件锁)锁机制及应用场景

拜拜、爱过 提交于 2020-04-27 22:39:51
模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量 C:\phpStudy\Apache\bin>ab.exe -c 10 -n 10 http: // localhost/try.php // -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本 Mysql中的锁语法: LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【锁表】 UNLOCK TABLES 【释放表】 Read:读锁|共享锁 : 所有的客户端只能读这个表不能写这个表 Write:写锁|排它锁: 所有当前锁定客户端可以操作这个表,其他客户端只能阻塞 注意:在锁表的过程中只能操作被锁定的表,如果要操作其他表,必须把所有要操作的表都锁定起来! PHP中的文件锁 : 文件锁的文件与表有什么关系?:一点关系也没有,与令牌相似,谁拿到谁操作。所以表根本没锁。 测试时,有个文件就行,叫什么名无所谓 总结: 项目中应该只使用PHP中的文件锁,尽量避免锁表,因为如果表被锁定了,那么整个网站中所有和这个表相关的功能都被拖慢了(例如:前台很多用户一直下订单,商品表mysql锁表,其他与商品表相关的操作一直处于阻塞状态【读不出来商品表】,因为一个功能把整个网站速度拖慢)。 比如在一个O2O外卖项目中,中午12-2点

php面试专题---7、文件及目录处理考点

我们两清 提交于 2020-04-27 22:33:59
php面试专题---7、文件及目录处理考点 一、总结 一句话总结: 用脑子:基本文件操作和目录操作了解一波,不必强求 1、不断在文件hello.txt头部写入一行“Hello World”字符串,要求代码完整? |||-begin <? php // 打开文件 // // 将文件的内容读取出来,在开头加入Hello World // // 将拼接好的字符串写回到文件当中 // // Hello 7891234567890 // $file = './hello.txt' ; $handle = fopen ( $file , 'r' ); $content = fread ( $handle , filesize ( $file )); $content = 'Hello World'. $content ; fclose ( $handle ); $handle = fopen ( $file , 'w' ); fwrite ( $handle , $content ); fclose ( $handle ); |||-end 不能使用把文件指针移到开头的方式,因为会覆盖 2、php访问远程文件? 开启allow_url_fopen,HTTP协议连接只能使用只读,FTP协议可以使用只读或者只写 3、php目录操作函数? 名称相关:basename()、dirname()

MySQL锁机制和PHP锁机制

时间秒杀一切 提交于 2020-04-27 21:18:43
模拟准备--如何模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本 例如:cmd: apache安装路径/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php 【切入正题】 MYSQL中的锁: 语法 : LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【锁表】 UNLOCK TABLES 【释放表】 Read:读锁|共享锁 : 所有的客户端只能读这个表不能写这个表 Write:写锁|排它锁: 所有当前锁定客户端可以操作这个表,其他客户端只能阻塞 注意:在锁表的过程中只能操作被锁定的表,如果要操作其他表,必须把所有要操作的表都锁定起来! PHP中的文件锁 (锁的是文件,不是表) 文件锁的文件与表有什么关系?:一点关系也没有,与令牌相似,谁拿到谁操作。所以表根本没锁。 测试时,有个文件就行,叫什么名无所谓 总结: 项目中应该只使用PHP中的文件锁,尽量避免锁表,因为如果表被锁定了,那么整个网站中所有和这个表相关的功能都被拖慢了(例如:前台很多用户一直下订单,商品表mysql锁表,其他与商品表相关的操作一直处于阻塞状态【读不出来商品表】,因为一个功能把整个网站速度拖慢

Linux C编程之十五 线程同步

ε祈祈猫儿з 提交于 2020-04-26 19:38:01
一、整体大纲 二、线程同步 1. 同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一 致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致等等。 而编程中、通信中所说的同步与生活中大家印象中的同步概念略有差异。“同”字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。 2. 线程同步 (1)线程同步概念 同步即协同步调,按预定的先后次序运行。 线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2: 内存中100字节,线程T1欲填入全1, 线程T2欲填入全0。但如果T1执行了50个字节失去cpu,T2执行,会将T1写过的内容覆盖。当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执 行结束,内存中的100字节,既不是全1,也不是全0。 产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。 “同步”的目的,是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间

PHP 文件的相关操作

一世执手 提交于 2020-04-26 13:30:09
文件的打开和关闭 主要是两个函数,fopen和fclose。 fopen ( string $filename , string $mode [, bool $use_include_path = FALSE [, resource $context ]] ) : resource 返回的是资源类型的数据 mode 打开模式:指的是文件打开是以写入、读取、执行等等方式 r:(只读模式)以只读方式打开,文件指针指向文件的开头部分 r+:(读写模式)以读写方式打开,文件指针指向文件的开头 w:(只写模式)以写方式打开,指针指向文件头部,如果文件不存在,会创建一个新文件,如果文件存在,文件内容会被清空 w+:(写读模式),指针指向文件头部,如果文件不存在,会创建一个新文件,如果文件存在,文件内容会被清空,可以读取 a:以追加方式打开,指针指向文件末尾(只写),如果文件不存在,会创建一个新文件 a+:以追加方式打开,如果文件存在,指针指向文件末尾,(读写)如果文件不存在,会创建一个新文件 文件的读取 可以读取单个字符、一行、整个文件、读任意长度的数据。 1、读取整个文件: 不需要对文件打开与关闭 readfile() readfile ( string $filename [, bool $use_include_path = FALSE [, resource $context ]] )

crontab+flock实现定时检测进程状态并重启

妖精的绣舞 提交于 2020-04-20 10:20:53
Crontab */1 * * * * flock -xn ./flock.lock -c "php -r \"sleep(120);\"" && rm ./flock.lock 注:我们担心常驻进程(死循环)运行时出现不知名错误,而导致进程中断执行,通过crontab+flock保证常驻进程的中断之后重启 Flock flock -xn ./flock.lock -c "php -r \"sleep(20);\"" && rm ./flock.lock 这条命令,第一次执行,可以发现几点 命令行会等待20s然后结束 命令回车执行之后,生成了 flock.lock 文件 20s等待完毕之后 flock.lock 文件被删除 在这20s等待期间, ps -ef | grep php 会出现两个相关进程,一个是php执行进程,一个是flock锁进程 在这20s等待期间,重复运行该命令,进程数量并不会增加 flock的一些参数指令 -s, --shared: 获得一个共享锁 -x, -e, --exclusive: 获得一个独占锁(排它锁) -u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁 -n, --nonblock: 如果没有立即获得锁,直接失败而不是等待 -w, --timeout: 如果没有立即获得锁,等待指定时间 -o, --close:

Perl IO:文件锁

旧城冷巷雨未停 提交于 2020-04-13 18:33:40
【今日推荐】:为什么一到面试就懵逼!>>> 文件锁 当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失。 例如进程1和进程2都要写入数据到a.txt中,进程1获取到了文件句柄,进程2也获取到了文件句柄,然后进程1写入一段数据,进程2写入一段数据,进程1关闭文件句柄,会将数据flush到文件中,进程2也关闭文件句柄,也将flush到文件中,于是进程1的数据被进程2保存的数据覆盖了。 所以,多进程修改同一文件的时候,需要协调每个进程: 保证文件在同一时间只能被一个进程修改,只有进程1修改完成之后,进程2才能获得修改权 进程1获得了修改权,就不允许进程2去读取这个文件的数据,因为进程2可能读取出来的数据是进程1修改前的过期数据 这种协调方式可以通过文件锁来实现。文件锁分两种,独占锁(写锁)和共享锁(读锁)。当进程想要修改文件的时候,申请独占锁(写锁),当进程想要读取文件数据的时候,申请共享锁(读锁)。 独占锁和独占锁、独占锁和共享锁都是互斥的。只要进程1持有了独占锁,进程2想要申请独占锁或共享锁都将失败(阻塞),也就保证了这一时刻只有进程1能修改文件,只有当进程1释放了独占锁,进程2才能继续申请到独占锁或共享锁。但是共享锁和共享锁是可以共存的,这代表的是两个进程都只是要去读取数据,并不互相冲突。 独占锁 共享锁 独占锁 × × 共享锁 ×

Perl进程间数据共享

99封情书 提交于 2020-04-13 15:53:41
【今日推荐】:为什么一到面试就懵逼!>>> 本文介绍的Perl进程间数据共享内容主体来自于《Pro Perl》的第21章。 IPC简介 通过fork创建多个子进程时,进程间的数据共享是个大问题,要么建立一个进程间通信的通道,要么找到一个两进程都引用的共享变量。本文将介绍Unix IPC的近亲System V IPC:message queues(消息队列)、semaphores(信号量)和shared memory-segments(共享内存段)。它们都是IPC结构,它们被非常广泛地应用于进程间通信。它们的帮助文档可参见: $ perldoc IPC::Msg $ perldoc IPC::Semaphore $ perldoc IPC::SharedMem 但是,并非所有操作系统都支持System V IPC,对于那些不遵守POSIX规范的平台就不支持。当然,也并非一定要在Unix操作系统上才能使用IPC,只要操作系统支持IPC就可以,而且就算是Unix系统上也并非一定支持IPC,可以使用 ipcs 命令来查看是否支持: $ ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid

Perl IO:随机读写文件

偶尔善良 提交于 2020-04-13 15:52:41
【今日推荐】:为什么一到面试就懵逼!>>> 随机读写 如果一个文件句柄是指向一个实体文件的,那么就可以对它进行随机数据的访问(包括随机读、写),随机访问表示可以读取文件中的任何一部分数据或者向文件中的任何一个位置处写入数据。 实现这种随机读写的功能依赖于一个文件读写位置指针(file pointer) 。 当一个文件句柄关联到了一个实体文件后,就可以操作这个文件句柄,比如通过这个文件句柄去移动文件的读写指针,当这个指针指向第100个字节位置处时,就表示从100个字节处开始读数据,或者从100个字节处开始写数据。 可以通过 seek()函数来设置读写指针的位置,通过tell()函数来获取文件读写指针的位置 。如果愿意的话, IO::Seekable 模块同样提供了一些等价的面向对象的操作方法,不过它们只是对seek、tell的一些封装,用法和工作机制是完全一样的。 需要注意的是,虽说文件读写指针不是属于文件句柄的,但通过文件句柄去操作读写指针的时候,可以认为指针是属于句柄的。例如,同一个文件的多个文件句柄的读写指针是独立的,如果文件A上同时打开了A1和A2两个文件句柄,那么在A1上设置的读写指针不会影响A2句柄的读写指针。 seek跳转文件指针位置 通过seek()函数,可以让文件的指针随意转到哪个位置。注意还有一个sysseek()函数,它们不同,seek(