php鎖變數
本文介紹了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
保證同一時間只有一個訪問有效,有效限制並發訪問。
為了避免系統突然出錯導致死鎖,所以在獲取鎖的時候增加一個過期時間,如果已超過過期時間,即使是鎖定狀態都會釋放鎖,避免死鎖導致的問題。
源碼下載地址:點擊查看
㈡ html中使用php 的變數
html標簽使用php中的變數方法如下:
一、如果html標簽中使用php變數,提示:Undefined index: uid in /var/www//list.php,list.php的具體代碼如下:
<?php
require'redis.php';
for($i=0;$i<=($redis->get("userid"));$i++){
$data[]=$redis->hgetall("user:".$i);
}
/*var_mp($data)的結果如下:
array(size=3)
0=>
array(size=0)
empty
1=>
array(size=4)
'uid'=>string'1'(length=1)
'username'=>string'jjj'(length=3)
'password'=>string'123'(length=3)
'age'=>string'20'(length=2)
2=>
array(size=4)
'uid'=>string'2'(length=1)
'username'=>string'lamp'(length=4)
'password'=>string'123'(length=3)
'age'=>string'20'(length=2)
*/
?>
<tableborder="1">
<caption>userlist</caption>
<tr>
<th>uid</th>
<th>username</th>
<th>age</th>
</tr>
<?phpforeach($dataas$v){?>
<tr>
<td><?phpecho$v['uid']?></td>
<td><?phpecho$v['username']?></td>
<td><?phpecho$v['age']?></td>
</tr>
<?php}?>
</table>
這時在echo 前 isset 下就可以了,代碼如下:
<?php$a=10;if(isset($a)){echo"這個變數存在";}else{echo"這個變數不存在";}?>
二、 php可以和html混編的 ,如下圖所示
㈢ php 定義變數
<?php//常量聲明!defined("PI") or define("PI", 3.14);//變數聲明$var = value; //value可以為值類型、引用類型、NULL、布爾類型、資源類型?>
㈣ 全局變數的PHP 超級全局變數
PHP中預定義了幾個"超級全局變數(superglobals) ,這意味著它們在一個腳本的全部作用域中都可用。 你不需要特別說明,就可以在函數及類中使用。
PHP 超級全局變數列表: $GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION 變數描述$GLOBAL$GLOBAL 是PHP的一個超級全局變數組,在一個PHP腳本的全部作用域中都可以訪問。
$GLOBAL 是一個包含了全部變數的全局組合數組。變數的名字就是數組的鍵。 $_SERVER$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 伺服器創建。不能保證每個伺服器都提供全部項目;伺服器可能會忽略一些,或者提供一些沒有在這里列舉出來的項目。$_REQUESTPHP $_REQUEST 用於收集HTML表單提交的數據。$_POSTPHP $_POST 被廣泛應用於收集表單數據,在HTML form標簽的指定該屬性:"method="post"。$_GETPHP $_GET 同樣被廣泛應用於收集表單數據,在HTML form標簽的指定該屬性:"method="get"。
㈤ php如何聲明 變數
需要准備的材料分別是:電腦、php編輯器、瀏覽器。
1、首先,打開php編輯器,新建php文件,例如:index.php。