使用 ab 测试
1
|
$ ab -t 20 -c 10 http: //192.168.1.104:9510/ |
三、利用文件排他锁 (非阻塞模式)
非阻塞模式下,如果进程在获取文件排他锁时,其它进程正在占用锁的话,此进程会马上判断获取锁失败,并且继续往下执行。\
示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php $http = new swoole_http_server( "0.0.0.0" , 9511); $http-> set (array( 'reactor_num' => 2, //reactor thread num 'worker_num' => 4 //worker process num )); $http-> on ( 'request' , function (swoole_http_request $request, swoole_http_response $response) { $uniqid = uniqid( 'uid-' , TRUE); $redis = new Redis(); $redis->connect( '127.0.0.1' , 6379); $fp = fopen( "lock.txt" , "w+" ); // 非阻塞模式, 如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB if (flock($fp,LOCK_EX | LOCK_NB)) //锁定当前指针 { // 成功取得锁后,放心处理订单 $rest_count = intval($redis-> get ( "rest_count" )); $value = "{$rest_count}-{$uniqid}" ; if ($rest_count > 0){ // do something ... $rand = rand(100, 1000000); $sum=0; for ($i=0;$i<$rand;$i++){ $sum+=$i; } $redis->lPush( 'uniqids' , $value); $redis->decr( 'rest_count' ); } // 订单处理完成后,再释放锁 flock($fp,LOCK_UN); } else { // 如果获取锁失败,马上进入这里执行 echo "{$uniqid} - 系统繁忙,请稍后再试" .PHP_EOL; } fclose($fp); }); $http->start(); |