2011-08-11 20 views
0

我正在開發一個記錄存儲系統,它將物理盒子中的掃描,索引和加密記錄存儲起來。如何阻止多個用戶在PHP中同時訪問單一方法?

我有一個方法說「getAvailablePlace()」,它檢查什麼盒和什麼seq可用於存儲。我想鎖定這個方法。也就是說,當一個用戶進入這個方法,他得到框:12 seq:55作爲空的地方..同時在同一時間另一個用戶訪問相同的方法,他也可能得到相同的值...盒:12 seq:55這是錯誤的俯臥。

所以如果我可以鎖定這個方法,當一個用戶已經進入這個過程?

我正在使用SQLite,wamp和codeigniter。

+0

什麼是您的操作系統? –

回答

1

我有這樣的代碼中使用:

define('LOCK_FILE', "/path/to/your/lockfile-".$argv[1].".lock"); 
if(isLocked()) die("ALREADY RUNNING !!!!\n"); 

function isLocked() 
{ 
    # If lock file exists, check if stale. If exists and is not stale, return TRUE 
    # Else, create lock file and return FALSE. 

    if(file_exists(LOCK_FILE)) 
    { 
     # check if it's stale 
     $lockingPID = trim(file_get_contents(LOCK_FILE)); 

     # Get all active PIDs. 
     $pids = explode("\n", trim(`ps -e | awk '{print $1}'`)); 

     # If PID is still active, return true 
     if(in_array($lockingPID, $pids)) return true; 

     # Lock-file is stale, so kill it. Then move on to re-creating it. 
     echo "Removing stale lock file.\n"; 
     unlink(LOCK_FILE); 
    } 

    file_put_contents(LOCK_FILE, getmypid() . "\n"); 
    return false; 
} 

你可以改變它不檢查PID和只使用文件鎖定信息。

+0

Thx scube ...我無法使用確切的代碼,因爲我想使用相同的方法來比較實體和金庫......但是這幫助了我......每次我輸入這個方法時,我都會將鎖定文件的內容與選定的實體並選擇Vault ..如果匹配方法被阻止,否則它將再次運行而沒有任何提示.thx – Roopa

1

這裏有一個通用的方法:有另一個表格存儲當前「鎖定」的方框。然後展開「getAvailablePlace()」以在生成下一個框ID之前檢查鎖定的框。生成包裝盒ID後,將其寫入鎖定表中。所有這三項操作都必須在數據庫事務中進行。

另一個解決方案是計算每個盒子數據庫中的序列號。如果您在交易中執行「獲得最大序列y,將其加1,寫回」,那麼您應該沒問題。

0

你不能在PHP中這樣做,因爲每個用戶都會收到他自己的'運行時'。但你可以用一些外部方法來做到這一點,例如數據庫中的locks表。因此,你的函數檢查表中是否存在某個記錄,如果是,則跳過/返回false或運行受保護的代碼(如果不是)。

請注意,您必須實現double-checking才能獲得真正無差錯的代碼。