2010-09-27 38 views
4

我一直在環顧四周,但我似乎無法找到任何POSIX命名信號的PHP實現的實現。我唯一看到的是SysV信號量。PHP命名爲信號量?

(2題)

有沒有辦法從PHP目前訪問命名信號?

有沒有計劃將來的PHP版本?

+0

爲什麼你需要訪問信號燈? PHP不支持線程... – 2010-09-27 20:56:38

+0

@Byron:你可以從不同的進程訪問同一個命名的信號量,而不僅僅是線程。 – VolkerK 2010-09-27 21:17:17

+0

我實際上需要鎖定一個PHP和perl腳本寫入的文件。並且可以有幾個運行PHP和perl腳本的實例。我也看到了flock()函數,但我認爲這不會訣竅。 – Ixai 2010-09-27 22:00:47

回答

2

我想簡短的答案是NO ,從我的「研究」,我發現沒有一個POSIX命名信號實現目前在PHP。

Bob Fanger發佈了一個有趣的解決方法,將字符串轉換爲SysV信號鍵,缺點是必須在每個需要信號量的代碼中實現相同的算法。

但是我最終做的是在鎖文件上使用了flock()

PHP

# open an exclusive lock 
$lock = fopen('/path/to/file.lock', 'w'); 
flock($lock, LOCK_EX); 

# edit a file 
$f = fopen ('/path/to/file.txt', 'a'); 
fwrite($f, "append through PHP\n"); 
fclose($f); 

# unlock 
flock($lock, LOCK_UN); 
fclose($lock); 

PERL

use Fcntl qw(:flock); 

# open an exclusive lock 
open LOCK, '>/path/to/file.lock'; 
flock LOCK, LOCK_EX; 

# edit a file 
open FILE, '>>/path/to/file.txt'; 
print FILE "append through PERL\n"; 
close FILE; 

# unlock 
flock LOCK, LOCK_UN; 
close LOCK; 

我知道額外的鎖定文件似乎是矯枉過正,但你只能用在寫模式LOCK_EX,有時我只需要閱讀文件。

注:flock()作品的諮詢文件鎖定機制,如果任何其他程序試圖修改該文件,而無需調用flock()它會成功。

3

這裏是我的「命名」信號量實現,但我不知道如果你正在尋找一個簡單的字符串到int轉換器。

/** 
* Generate a semaphore integer from a string/key 
* 
* @param string $identifier 
* @return int 
*/ 
function sem_key($identifier) { 
    $md5 = md5($identifier); 
    $key = 0; 
    for ($i = 0; $i < 32; $i++) { 
     $key += ord($md5{$i}) * $i; 
    } 
    return $key; 
} 
+0

有趣的解決方法。我實際上玩過flock()函數,這正是我所需要的,但我很欣賞你的答案。 我是新來的StackOverflow(你可能已經注意到了)。有什麼方法可以將此問題標記爲「不再需要回答」?或者,我是否應該將您的答案標記爲「已接受的答案」? – Ixai 2010-09-29 22:48:16

+0

你應該用你使用的解決方案回答你自己的問題。並將自己的答案標記爲「已接受的答案」 – 2010-09-30 07:40:09

+0

碰撞的可能性有多大?系統上還有其他進程可能會與它衝突? – 2013-09-17 13:21:59