php下有沒有互斥鎖的實現方案

木有...至於鎖的方案一般由資源自己實現。比如對資料庫和緩存的訪問。PHP進程都是單線程模型,如果資源不可讀寫,則阻塞。不過PHP有文件鎖的機制,這貌似是PHP唯一支持的鎖...

Ⅱ php mysql的鎖機制 怎麼寫

|共MYSQL中的鎖:來
語法 :
LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【鎖表自】
UNLOCK TABLES 【釋放表】

Read:讀鎖|共享鎖 : 所有的客戶端只能讀這個表不能寫這個表
Write:寫鎖|排它鎖: 所有當前鎖定客戶端可以操作這個表,其他客戶端只能阻塞
注意:在鎖表的過程中只能操作被鎖定的表,如果要操作其他表,必須把所有要操作的表都鎖定起來!

PHP中的文件鎖 (鎖的是文件,不是表)
文件鎖的文件與表有什麼關系?:一點關系也沒有,與令牌相似,誰拿到誰操作。所以表根本沒鎖。
測試時,有個文件就行,叫什麼名無所謂

Ⅲ 怎麼加線程鎖 php

PHP語言本身是不支持多線程的。網上關於PHP模擬多線程的方法,都是利用了LINUX和APACHE等本身所具有的多線程能力。既然是模擬的,就不是真正的多線程,其實只是多進程。
1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum = 10; /// 進程總數
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的數據信息
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

也可以把需要多線程處理的部分交給java去處理,然後在PHP里調用。

<?php
system('java multiThread.java');
?>

Ⅳ php 如何鎖表

在進行數據表檢查或修補時,可以先將數據表鎖定,可確保數據表的安全:
mysql>LOCK TABLE tbl_name READ;
mysql>FLUSH TABLES;

將數據表鎖定後再進行檢查或修補的工作。完成後再解除鎖定:
mys(www.111cn.net)ql>UNLOCK TABLES;
//LOCK TABLE tbl_name READ表示要鎖定成只讀狀態,在這個狀態下用戶只能讀取數據表,不能寫入。
LOCK TABLE tbl_name WRITE則是更嚴格的鎖定,用戶不能讀取也不能寫入。

Ⅳ 什麼是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如何使用文件鎖解決高並發問題

<?php
//連接資料庫
$con=mysqli_connect("192.168.2.186","root","root","test");
//查詢商品數量是否大於0,大於0才能下單,並減少庫存
$fp = fopen("lock.txt", "r");
//加鎖
if(flock($fp,LOCK_EX))
{
$res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');}
//執行完版成解鎖權
flock($fp,LOCK_UN);
}
//關閉文件
fclose($fp);
unset($res);
mysqli_close($con);
?>

Ⅶ php 文件鎖有什麼用

一般文件鎖在解決少量並發的時候是起作用的。
比如:處理庫存的時候作一個標記位, 還有定時任務計劃的時候,避免重復。

Ⅷ php中mysql加鎖問題

有表鎖,復行鎖,頁鎖

頁級制:引擎 BDB。
表級:引擎 MyISAM , 理解為鎖住整個表,可以同時讀,寫不行
行級:引擎 INNODB , 單獨的一行記錄加鎖

1) 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,並發度最低。
2) 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,並發度也最高。
3) 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般。

一般不在PHP中使用鎖操作,因為如果鎖了庫,如果遇到錯誤沒有及時的解鎖,就會導致不能訪問數據的情況。

可以使用MYSQL的事務,就是定義事務開始,然後有幾個語句要執行,然後根據情況,如果有一個語句沒有執行成功,可以回滾(取消這幾個語句的執行),從而達到幾個語句都執行成功或者都不執行的效果,在強事務型的應用中一般使用這個方式
你可以去後盾人平台看看,裡面的東西不錯

Ⅸ php死鎖的用法

Description
void session_write_close ( void )
End the current session and store session data.
Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one e to this locking. You can rece the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

功能: 結束當前的session 操作 保存session 數據
說的很明白了, 當腳本請求沒有調用session_write_close(); 時雖然 session 的數據是存儲住了。但是 session Date(也就是session 文件) 是鎖住狀態
是為了避免 其他應用此時操作session 造成不必要後果 當使用框架時 不同文件可能會不停地操作session 為了不造成其他操作對當前session 的死鎖等待
可使用此函數...這樣試試呢如果你對php這類有興趣的話,可以和我一樣在後盾人經常看看教材,自己多看幾遍,慢慢的以後就明白了,希望能幫到你,給個點贊吧謝謝(((*°▽°*)八(*°▽°*)))♪

Ⅹ PHP有沒有高效的鎖同步方案

flock感覺效率低,要頻繁訪問文件系統;

Mutex, Semaphore, 還需要重新編譯PHP/安裝才能用;

有沒有一個輕量級的,如鎖定變數或者某個名字,通過內存實現的鎖同步方案?