一阻塞模式:(如果其他程序已經加鎖檔案,當前程序會一直等其他程序解鎖檔案後繼續執行)
<?php
//連線資料庫
$con
=mysqli_connect
("192.168.2.186"
,"root"
,"root"
,"test");
//查詢商品數量是否大於0,大於0才能下單,並減少庫存
$fp=
fopen
("lock.txt"
,"r");
//加鎖if(
flock
($fp
,lock_ex))
//執行完成解鎖
flock
($fp
,lock_un);
}//關閉檔案
fclose
($fp);
unset
($res);
mysqli_close
($con);
?>
二非阻塞模式:
<?php
//連線資料庫
$con
=mysqli_connect
("192.168.2.186"
,"root"
,"root"
,"test");
//查詢商品數量是否大於0,大於0才能下單,並減少庫存
$fp=
fopen
("lock.txt"
,"r");
//加鎖if(
flock
($fp
,lock_ex
|lock_nb))
//執行完成解鎖
flock
($fp
,lock_un);
}//關閉檔案
fclose
($fp);
unset
($res);
mysqli_close
($con);
?>
使用ab.exe同樣500併發,資料庫的庫存保持為0,成功解決
fopen中r+和w+的區別
r+: open for reading and writing. the stream is positioned at the beginning of the file.
w+:open for reading and writing. the file is created if it does not exist, otherwise it is truncated. the stream is positioned at the beginning of the file.
r+具有讀寫屬性,從檔案頭開始寫,保留原檔案中沒有被覆蓋的內容;
w+具有讀寫屬性,寫的時候如果檔案存在,會被清空,從頭開始寫。
r 開啟唯讀檔案,該檔案必須存在。
r+ 開啟可讀寫的檔案,該檔案必須存在。
w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。
上述的形態字串都可以再加乙個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函式庫開啟的檔案為二進位制檔案,而非純文字檔案。不過在posix系統,包含linux都會忽略該字元。
PHP 利用檔案鎖處理高併發
利用flock 函式對檔案進行加鎖 排它鎖 實現併發按序進行。flock file,lock,block 有三個引數。file 已經開啟的檔案 lock 鎖的型別 lock sh 共享鎖 讀鎖 lock ex 獨佔鎖定 排它鎖,寫鎖 lock un 解鎖 lock nb 如果希望在檔案鎖定時阻塞程序...
PHP 利用檔案鎖處理高併發
利用flock 函式對檔案進行加鎖 排它鎖 實現併發按序進行。flock file,lock,block 有三個引數。file 已經開啟的檔案 lock 鎖的型別 lock sh 共享鎖 讀鎖 lock ex 獨佔鎖定 排它鎖,寫鎖 lock un 解鎖 lock nb 如果不希望在檔案鎖定時阻塞程...
PHP 利用檔案鎖處理高併發
利用flock 函式對檔案進行加鎖 排它鎖 實現併發按序進行。flock file,lock,block 有三個引數。file 已經開啟的檔案 lock 鎖的型別 lock sh 共享鎖 讀鎖 lock ex 獨佔鎖定 排它鎖,寫鎖 lock un 解鎖 lock nb 如果希望在檔案鎖定時阻塞程序...