亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php中原子操作與文件鎖flock的介紹(代碼示例)

2020-03-22 19:27:12
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于php中原子操作與文件鎖flock的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

php原子操作,文件鎖flock,數據庫事務

php沒有繼承posix標準支持的unix鎖,只封裝了一個linux系統調用flock(信號量也能做成鎖),按理也是可以使用鎖機制的,雖然效率低一點。
php腳本是運行在fastcgi容器中,而fastcgi是多進程的,所以如果php程序訪問了臨界資源,勢必造成程序結果的不正確性。
估計還要考慮下fastcgi容器的問題

問題描述:黑客用的工具刷我們的后臺
取消訂單時會有退款,黑客并發取消訂單,導致多次退款
如果請求一個一個來,哪怕間隔100毫秒,也是沒有問題的

一個PHP處理過程是: 讀退款標志,發現沒退款, 退款,然后設置已退款標志
問題是多個請求同時到了,讀出來的退款標志都是未退款,所以多個請求都退款了
同一個php文件,被同時請求多次,是同一時刻

用php文件鎖flock 我們試了不行,還是用C++隊列
用C++監聽了一個端口,直接接收HTTP包,然后返回HTTP格式的包,PHP程序中用curl訪問我這個C程序.
相當于遠程調用了,可以部署到其他服務器做分布式了

很多時候,我們并沒有考慮我們php代碼的并行能力,尤其是在我們的php代碼對某個資源可讀可寫的時候。但這并不是說php的所有操作就都是原子的,事務的,可并行的。由于php腳本是運行在fastcgi容器中,而fastcgi是多進程的,所以如果php程序訪問了臨界資源,勢必造成程序結果的不正確性。

解決問題的辦法是使用鎖機制。php沒有繼承posix標準支持的unix鎖:比如記錄鎖fcntl,線程鎖等,而只封裝了一個linux系統調用flock(信號量也能做成鎖),flock形式為flock($fp,$type),其中$fp為文件句柄,而$type為:
/* 當一個文件的打開方式是可讀可寫的,通常需要向文件加入鎖機制 */

1. LOCK_SH 共享鎖:
通常為進程向文件請求讀操作時需加共享鎖。共享鎖可支持任意個進程間的讀操作,如果寫一個加了共享鎖的文件則進程阻塞進入SLEEP狀態值到共享鎖解鎖

2. LOCK_EX 獨占鎖:
通常為進程向文件的寫操作加獨占鎖,一旦文件加上了該鎖,則其他任意進程訪問該文件時都會阻塞,直到解鎖為止。

3. LOCK_UN 解鎖:
為加鎖的文件句柄解鎖

這樣的加鎖方式必然可以保證加鎖程序塊的原子性,但同時也犧牲了程序的效率,因此,我們實際的程序中應該在程序的加鎖和解鎖代碼間嵌入盡量少的程序邏輯(尤其是獨占鎖),保證程序盡快解鎖。

最后,附上加上鎖機制以后的程序:

 ?php $usrinfo = isset($_GET[ usrinfo ])?$_GET[ usrinfo ]:exit(1); $stinfo = isset($_GET[ stinfo ])?$_GET[ stinfo ]:exit(1); echo $stinfo; $pid = posix_getpid(); $fp = fopen(“usrinfo.txt”,”a+”); $num = rand(0,100000); flock($fp,LOCK_EX); fwrite($fp,”user:”.$usrinfo.” stinfo:”.$stinfo.”–”.$pid.”–”.$num.”/n”); fwrite($fp,”talking 1 — pid:$pid and num:$num/n”); flock($fp,LOCK_UN); fclose($fp);

普通情況運行該程序,產生正確的結果。

用什么方法可以在業務批量操作時保證原子性呢?
例如:刪除多條文章,但在中間有一條已經被刪除了,假設這里會出現錯誤,那如何讓整個操作回滾,并定位錯誤信息呢?
數據庫的事務保證原子性但不能定位錯誤信息,但遇到無法使用事務的場景,應該怎么做呢?

利用數據庫的事務來做是最合理的,錯誤信息可以記錄啊,有操作失敗拋出錯誤。
應用邏輯來保證,就是每操作一次做下記錄,成功失敗都做下記錄。中間出錯,可以把成功的回滾。一般我們刪除是假刪除,所以很容易。如果真刪除,記錄時要記錄完整信息。

PHP用文件鎖模擬進程鎖,實現原子操作
用PHP實現原子操作,而PHP本身并沒有提供進程鎖機制,用PHP文件鎖機制,通過文件鎖模擬進程鎖實現原子操作。

原子操作的代碼之前,使用排他鎖打開某個文件,代碼如下:

$fp = fopen( LOCK_FILE_PATH, r );if (!$fp) { echo Failed to open the lock file!  exit(1);//異常處理flock ( $fp, LOCK_EX );

原子操作的代碼之后,對該文件解鎖,并關閉文件,代碼如下:

flock ( $fp, LOCK_UN );fclose ( $fp );

整體偽代碼為:

define( LOCK_FILE_PATH , /tmp/lock if( !file_exists(LOCK_FILE_PATH) ){ $fp = fopen( LOCK_FILE_PATH, w );fclose ( $fp );$fp = fopen( LOCK_FILE_PATH, r );if (!$fp) {echo Failed to open the lock file! exit(1);//異常處理flock ( $fp, LOCK_EX );//此處添加原子操作代碼flock ( $fp, LOCK_UN );fclose ( $fp );

以上便可實現PHP原子操作,避免沖突。

php原子操作與mysql原子操作

原子操作常用的方法就是通過數據回滾來實現,用 PHP 來實現數據庫回滾操作相當簡單:
1, 建立數據庫連接
2, mysql_query( BEGIN 開啟事務
3, $SQL = ...
mysql_query($SQL); 做相應的數據庫操作
4, 判斷回滾條件:
if(mysql_errno)
{
print mysql_error();
mysql_query( ROLLBACK 出錯就回滾
exit();
}
5,可以重復上述步驟 3 及步驟 4 的操作, 開始的過程(中間可以加入其他操作,不局限于數據庫更新,但是注意,最好不要讓一個事務時間過長,因為它鎖定所有你用到的表,會影響其他程序使用)
你也可以在幾條正確的sql更新語句后故意寫一句錯誤的,看看是否回滾了。
6, 結束回滾操作
mysql_query( COMMIT 能夠到這里,代表上述數據庫操作都沒有錯,正式提交執行

這就是用 PHP 實現原子操作的整個過程,需要特別注意的是建立支持數據回滾操作的表結構,
另外,除 commit 外也有其它辦法可以結束回滾操作。

以上就是php中原子操作與文件鎖flock的介紹(代碼示例)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
深夜福利亚洲导航| 国产69久久精品成人| 久久久免费精品| 日韩av在线免费看| 精品久久中文字幕久久av| 日韩精品亚洲精品| 欧美性视频在线| 国产精品免费久久久久影院| 欧美亚洲第一页| 日韩最新中文字幕电影免费看| …久久精品99久久香蕉国产| 亚洲性av在线| 久久久久久中文字幕| 亚洲精品小视频在线观看| 国产精品一区二区久久国产| 欧美福利小视频| 2018中文字幕一区二区三区| 久久亚洲精品成人| 久久理论片午夜琪琪电影网| 色综合91久久精品中文字幕| 97视频色精品| 欧美激情三级免费| 久久久久一本一区二区青青蜜月| 91理论片午午论夜理片久久| 国产日韩欧美91| 亚洲一区制服诱惑| 国产精品欧美日韩| 亚洲专区国产精品| 亚洲综合在线中文字幕| 亚洲成人激情图| 91精品国产色综合久久不卡98口| 日韩中文在线视频| 日韩精品久久久久久久玫瑰园| 国产999精品久久久| 午夜剧场成人观在线视频免费观看| 日韩经典中文字幕| 51精品国产黑色丝袜高跟鞋| 国产精品影片在线观看| 国产成人久久久| 亚洲激情视频在线| 亚洲欧美日韩国产中文专区| 国产成人精品免高潮在线观看| 欧美性感美女h网站在线观看免费| 国产精品69精品一区二区三区| 国产一区二区三区在线免费观看| 一区二区三区动漫| 欧美成人免费全部观看天天性色| 国产精品久久久久久久久免费| 91中文精品字幕在线视频| 欧美激情奇米色| 欧美第一黄色网| 欧美孕妇毛茸茸xxxx| 亚洲美女性生活视频| 爱福利视频一区| 日韩精品免费在线视频观看| 大桥未久av一区二区三区| 国产欧美va欧美va香蕉在线| 91亚洲va在线va天堂va国| 久久久噜噜噜久久久| 国产欧美精品在线播放| 亚洲精品日韩av| 亚洲精品第一国产综合精品| 欧美国产高跟鞋裸体秀xxxhd| 美女999久久久精品视频| 欧美激情一区二区三区成人| 国产精品va在线播放| 亚洲va欧美va在线观看| 97精品国产97久久久久久春色| 国产精品欧美亚洲777777| 国产中文字幕日韩| 日韩经典一区二区三区| 中文字幕亚洲综合久久| 欧洲美女免费图片一区| 成人在线精品视频| 亚洲成人动漫在线播放| 国产69久久精品成人| 精品视频在线播放免| 亚洲人成在线观看| 国产精品专区第二| 日韩视频免费在线| 欧美天堂在线观看| 国产精品欧美久久久| 欧美精品第一页在线播放| 精品中文字幕在线2019| 国产精品大陆在线观看| 成人乱人伦精品视频在线观看| 亚洲r级在线观看| 精品久久久久久亚洲精品| 国产日韩欧美视频| 欧美成人黄色小视频| 国产精品久久激情| 日韩天堂在线视频| 日本精品久久久| 韩国三级日本三级少妇99| 日韩最新免费不卡| 欧美午夜片在线免费观看| 精品久久久在线观看| 日本久久久a级免费| 亚洲永久免费观看| 亚洲天堂色网站| 亚洲色在线视频| 欧美wwwxxxx| 日韩一区二区三区在线播放| 色综合伊人色综合网| 欧美亚州一区二区三区| 91高潮精品免费porn| 欧美在线视频在线播放完整版免费观看| 国产精品视频一区二区高潮| 国产精品扒开腿爽爽爽视频| 国产精品旅馆在线| 欧美成人在线免费视频| www.欧美三级电影.com| 国产精品男女猛烈高潮激情| 欧美亚洲成人免费| 欧美一级大片视频| 国产午夜精品免费一区二区三区| 欧美贵妇videos办公室| 亚洲精品一区二区久| 欧美精品在线免费播放| 日韩国产欧美精品一区二区三区| 尤物精品国产第一福利三区| 最近中文字幕2019免费| 国产视频久久久久久久| 国产精品高清网站| 欧美极品美女电影一区| 国产精品爱久久久久久久| 国产精品久久久久久中文字| 国产美女搞久久| 国产欧美久久久久久| 欧美在线观看www| 亚洲精品综合精品自拍| 欧美精品在线第一页| 97精品视频在线播放| 2019最新中文字幕| 亚洲精品成人av| 亚洲免费av电影| 欧美性色视频在线| 欧美片一区二区三区| 日本久久久久久久久| 69久久夜色精品国产7777| 国产精品视频99| 欧美在线视频观看免费网站| 久久精品中文字幕一区| 欧美黑人xxx| 中文日韩在线视频| 国产精品成人久久久久| 久久久久久久一| 欧美肥婆姓交大片| 国产午夜精品免费一区二区三区| 最近2019中文字幕第三页视频| 亚洲美女性生活视频| 日韩欧美国产中文字幕| 精品网站999www| 日韩成人av在线| 欧美另类精品xxxx孕妇| 欧美在线观看日本一区| 亚洲va码欧洲m码| 国产91ⅴ在线精品免费观看| 国产va免费精品高清在线| 亚洲视频自拍偷拍| 最近2019中文字幕大全第二页| 97久久超碰福利国产精品…| 亚洲少妇激情视频| 亚洲精品黄网在线观看|