PHP中并发的场景有哪些

  

PHP中并发的场景有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>一、利用复述,事务特征

复述,事务是原子操作,可以保证订单处理的过程中数据没有被其它并发的进程修改。

示例代码:

& lt; PHP ?   $ http =, new  swoole_http_server (“0.0.0.0",, 9509);,,//,监听,9509      http→美元集(阵列(   & # 39;才能reactor_num& # 39;,=祝辞,2,,//reactor  thread  num   & # 39;才能worker_num& # 39;,=祝辞,4,,//worker  process  num   ));      http→美元(& # 39;请求# 39;,,function  (swoole_http_request 请求,美元,swoole_http_response  $响应),{   时间=美元才能uniqid 函数(& # 39;uid & # 39;,,真的),,,//,模拟唯一用户ID   时间=美元才能redis  new 复述,();   复述→美元才能连接(& # 39;127.0.0.1 # 39;,,6379);,,//,连接,复述      复述→美元才能观看(& # 39;rest_count& # 39;);,//,监测,rest_count 是否被其它的进程更改      时间=美元才能rest_count  intval中(复述→美元(“rest_count")),,//,模拟唯一订单ID   如果才能(rest_count 美元;祝辞,0){   ,,,value 美元;=,“{$ rest_count} -{$函数},,,//,表示当前订的单,被当前用户抢到了      ,,,//,do  something ……,主要是模拟用户抢到单后可能要进行的一些密集运算   ,,,rand 美元;=,兰德(100,,1000000);   ,,,美元金额=0;   ,,,for  (i=0; i<美元;兰德美元,美元我+ +){,总和+=我;美元,}      ,,//,redis 事务   ,,,复述,→美元多();   ,,,复述,→美元lPush (& # 39; uniqids& # 39;,,美元值);   ,,,复述,→美元12月(& # 39;rest_count& # 39;);   ,,,replies 美元;=,复述,→美元exec();,//,执行以上,redis 事务      ,,//,如果,rest_count 的值被其它的并发进程更改了,以上事务将回滚   ,,,如果(! $回答){   ,,,,,echo “订单,{$价值},回滚“.PHP_EOL;   ,,,}   ,,}   复述→美元才能unwatch ();   });      http→美元开始();

使用ab测试

,美元ab  -t  20, -c  10, http://192.168.1.104:9509

<强>二,利用文件排他锁(阻塞模式)

阻塞模式下,如果进程在获取文件排他锁时,其它进程正在占用锁的话,此进程会挂起等待其它进程释放锁后,并自己获取到锁后,再往下执行。

示例代码:

& lt; php ?   $ http =, new  swoole_http_server (“0.0.0.0",, 9510);      http→美元集(阵列(   & # 39;才能reactor_num& # 39;,=祝辞,2,,//reactor  thread  num   & # 39;才能worker_num& # 39;,=祝辞,4,,//worker  process  num   ));      http→美元(& # 39;请求# 39;,,function  (swoole_http_request 请求,美元,swoole_http_response  $响应),{      时间=美元才能uniqid 函数(& # 39;uid & # 39;,,真的);   时间=美元才能redis  new 复述,();   复述→美元才能连接(& # 39;127.0.0.1 # 39;,,6379);      时间=美元才能fp  fopen (“lock.txt",,“w +“);//才能,阻塞(等待)模式,,要取得独占锁定(写入的程序)   如果才能(群(fp美元,LOCK_EX)),,//锁定当前指针   {才能//,,,成功取得锁后,放心处理订单   ,,,rest_count 美元;=,intval中(复述→美元(“rest_count"));   ,,,value 美元;=,“{$ rest_count} -{$函数}“;   ,,,如果(rest_count 美元;祝辞,0){   ,,,,,//,do  something …   ,,,,,rand 美元;=,兰德(100,,1000000);   ,,,,,美元金额=0;   ,,,,,for  (i=0; i<美元;兰德美元,美元我+ +){,总和+=我;美元,}      ,,,,,复述,→美元lPush (& # 39; uniqids& # 39;,,美元值);   ,,,,,复述,→美元12月(& # 39;rest_count& # 39;);   ,,,}      ,,//,订单处理完成后,再释放锁   ,,,群(fp美元,LOCK_UN);   ,,}   文件关闭才能(fp);      });      http→美元开始();

使用ab测试

,美元ab  -t  20, -c  10, http://192.168.1.104:9510

<强>三,利用文件排他锁(非阻塞模式)

非阻塞模式下,如果进程在获取文件排他锁时,其它进程正在占用锁的话,此进程会马上判断获取锁失败,并且继续往下执行。

示例代码:

& lt; php ?   $ http =, new  swoole_http_server (“0.0.0.0",, 9511);      http→美元集(阵列(   & # 39;才能reactor_num& # 39;,=祝辞,2,,//reactor  thread  num   & # 39;才能worker_num& # 39;,=祝辞,4,,//worker  process  num   ));      http→美元(& # 39;请求# 39;,,function  (swoole_http_request 请求,美元,swoole_http_response  $响应),{      时间=美元才能uniqid 函数(& # 39;uid & # 39;,,真的);   时间=美元才能redis  new 复述,();   复述→美元才能连接(& # 39;127.0.0.1 # 39;,,6379);      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

PHP中并发的场景有哪些