導航:首頁 > 編程語言 > php讀鎖

php讀鎖

發布時間:2023-12-01 12:41:36

php 中的mysql for update 加鎖後還其他用戶還能讀取嗎

加鎖後只能讀,但不能寫。

② 什麼是php鎖定文件

語法
flock(file,lock,block)

參數
描述

file 必需。規定要鎖定或釋放的已打開的文件。
lock 必需。規定要使用哪種鎖定類型。
block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。
說明
flock() 操作的 file 必須是一個已經打開的文件指針。
lock 參數可以是以下值之一:
要取得共享鎖定(讀取的程序),將 lock 設為 LOCK_SH(PHP 4.0.1 以前的版本設置為 1)。
要取得獨占鎖定(寫入的程序),將 lock 設為 LOCK_EX(PHP 4.0.1 以前的版本中設置為 2)。
要釋放鎖定(無論共享或獨占),將 lock 設為 LOCK_UN(PHP 4.0.1 以前的版本中設置為 3)。

③ php 使用redis鎖限制並發訪問類示例

本文介紹了php
使用redis鎖限制並發訪問類,並詳細的介紹了並發訪問限制方法。
1.並發訪問限制問題
對於一些需要限制同一個用戶並發訪問的場景,如果用戶並發請求多次,而伺服器處理沒有加鎖限制,用戶則可以多次請求成功。
例如換領優惠券,如果用戶同一時間並發提交換領碼,在沒有加鎖限制的情況下,用戶則可以使用同一個換領碼同時兌換到多張優惠券。
偽代碼如下:
if
A(可以換領)

B(執行換領)

C(更新為已換領)
D(結束)
如果用戶並發提交換領碼,都能通過可以換領(A)的判斷,因為必須有一個執行換領(B)後,才會更新為已換領(C)。因此如果用戶在有一個更新為已換領之前,有多少次請求,這些請求都可以執行成功。
2.並發訪問限制方法
使用文件鎖可以實現並發訪問限制,但對於分布式架構的環境,使用文件鎖不能保證多台伺服器的並發訪問限制。
Redis是一個開源的使用ANSI
C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
本文將使用其setnx方法實現分布式鎖功能。setnx即Set
it
N**ot
eX**ists。
當鍵值不存在時,插入成功(獲取鎖成功),如果鍵值已經存在,則插入失敗(獲取鎖失敗)
RedisLock.class.PHP
<?php
/**
*
Redis鎖操作類
*
Date:
2016-06-30
*
Author:
fdipzone
*
Ver:
1.0
*
*
Func:
*
public
lock
獲取鎖
*
public
unlock
釋放鎖
*
private
connect
連接
*/
class
RedisLock
{
//
class
start
private
$_config;
private
$_redis;
/**
*
初始化
*
@param
Array
$config
redis連接設定
*/
public
function
__construct($config=array()){
$this->_config
=
$config;
$this->_redis
=
$this->connect();
}
/**
*
獲取鎖
*
@param
String
$key
鎖標識
*
@param
Int
$expire
鎖過期時間
*
@return
Boolean
*/
public
function
lock($key,
$expire=5){
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
//
不能獲取鎖
if(!$is_lock){
//
判斷鎖是否過期
$lock_time
=
$this->_redis->get($key);
//
鎖已過期,刪除鎖,重新獲取
if(time()>$lock_time){
$this->unlock($key);
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
}
}
return
$is_lock?
true
:
false;
}
/**
*
釋放鎖
*
@param
String
$key
鎖標識
*
@return
Boolean
*/
public
function
unlock($key){
return
$this->_redis->del($key);
}
/**
*
創建redis連接
*
@return
Link
*/
private
function
connect(){
try{
$redis
=
new
Redis();
$redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);
if(empty($this->_config['auth'])){
$redis->auth($this->_config['auth']);
}
$redis->select($this->_config['index']);
}catch(RedisException
$e){
throw
new
Exception($e->getMessage());
return
false;
}
return
$redis;
}
}
//
class
end
?>
demo.php
<?php
require
'RedisLock.class.php';
$config
=
array(
'host'
=>
'localhost',
'port'
=>
6379,
'index'
=>
0,
'auth'
=>
'',
'timeout'
=>
1,
'reserved'
=>
NULL,
'retry_interval'
=>
100,
);
//
創建redislock對象
$oRedisLock
=
new
RedisLock($config);
//
定義鎖標識
$key
=
'mylock';
//
獲取鎖
$is_lock
=
$oRedisLock->lock($key,
10);
if($is_lock){
echo
'get
lock
success<br>';
echo
'do
sth..<br>';
sleep(5);
echo
'success<br>';
$oRedisLock->unlock($key);
//
獲取鎖失敗
}else{
echo
'request
too
frequently<br>';
}
?>
測試方法:
打開兩個不同的瀏覽器,同時在A,B中訪問demo.php
如果先訪問的會獲取到鎖
輸出
get
lock
success
do
sth..
success
另一個獲取鎖失敗則會輸出request
too
frequently
保證同一時間只有一個訪問有效,有效限制並發訪問。
為了避免系統突然出錯導致死鎖,所以在獲取鎖的時候增加一個過期時間,如果已超過過期時間,即使是鎖定狀態都會釋放鎖,避免死鎖導致的問題。
源碼下載地址:點擊查看

④ 並發時,php操作mysql需要加鎖嗎mysql在並發時讀寫數據表會加鎖,我覺得不用再手動加鎖,請問是這樣嗎

如果要一次性做很多次插入,最好在每個循環的前後加上LOCK TABLES和UNLOCK TABLES,從而讓其他進程也能訪問數據表;這么做性能依然不錯。

不然的話,會導致數據莫明其妙的插入不完整,或者沒插進去的情況。

⑤ PHP MYSQL中 表鎖和行鎖 一般什麼情況下使用 另外具體怎麼寫

手動加鎖:
表級鎖
lock tables tablename read;//共享鎖
lock tables tablename write;//排它鎖
unlock tables;//解鎖

php直接query就行了。

除了MyIsam,誰還會無聊到顯式加鎖?
InnoDB直接跑事務默認會觸發隱式鎖,不需要自己lock和unlock。

⑥ PHP 如何使用文件鎖

//WRITE
$fp = fopen("test.txt", 'ab'); //From the end
flock($fp, LOCK_EX); //lock the file for waiting...
fwrite($fp, 'Just A Test String.......'); //Start writing...
flock($fp, LOCK_UN); //Release write lock
fclose($fp); //Close the file讀操作:

//READ
$fp = fopen("test.txt", 'r');
flock($fp, LOCK_SH);
//Read from the file.......
flock($fp, LOCK_UN);
fclose($fp);來詳細的看看 PHP 手冊上面關於函數 flock 的介紹吧:

flock -- 輕便的咨詢文件鎖定

其函數原型為:bool flock ( int handle, int operation [, int &wouldblock] )

PHP 支持以咨詢方式(也就是說所有訪問程序必須使用同一方式鎖定, 否則它不會工作)鎖定全部文件的一種輕便方法,需要注意的地方是:在 Windows 下 flock() 將會強制執行。flock() 操作的 handle 必須是一個已經打開的文件指針。operation 可以是以下值之一:

要取得共享鎖定(讀取的程序),將 operation 設為 LOCK_SH(PHP 4.0.1 以前的版本設置為 1)。

要取得獨占鎖定(寫入的程序),將 operation 設為 LOCK_EX(PHP 4.0.1 以前的版本中設置為 2)。

要釋放鎖定(無論共享或獨占),將 operation 設為 LOCK_UN(PHP 4.0.1 以前的版本中設置為 3)。

如果不希望 flock() 在鎖定時堵塞,則給 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中設置為 4)。 flock() 允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的 Unix 派生版和甚至是 Windows)。如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設置為 TRUE。鎖定操作也可以被 fclose() 釋放(代碼執行完畢時也會自動調用)。如果成功則返回 TRUE,失敗則返回 FALSE。

⑦ 開發php網站,mysql做資料庫一定要用鎖嗎

一般情況下,MYSQL在更新操作會自動加表鎖。不需要顯式加鎖。除非是數據要求嚴格的邏輯寫順序。
執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程並不需要用戶干預,因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。

閱讀全文

與php讀鎖相關的資料

熱點內容
單片機中計數 瀏覽:861
天線設計pdf 瀏覽:456
51單片機rtos 瀏覽:869
視頻以pdf格式 瀏覽:375
pc機與單片機串列通信 瀏覽:963
華為白牌伺服器是什麼 瀏覽:143
信任社會pdf 瀏覽:562
png圖片無損壓縮 瀏覽:863
江陰cnc編程培訓技術學校 瀏覽:307
centos命令行亂碼 瀏覽:293
赤峰加密防塵網廠 瀏覽:8
無錫程序員接私活小程序 瀏覽:494
單片機怎麼做手工 瀏覽:814
pdf君主論 瀏覽:441
如何把網站添加到伺服器 瀏覽:707
如何刷機升級安卓11 瀏覽:581
linux設備管理命令 瀏覽:567
有什麼解壓的軟體可以打開 瀏覽:72
文件管理裡面的空文件夾能刪嗎 瀏覽:178
新量能成交量通達信指標公式源碼 瀏覽:993