我一直在環顧四周,但我似乎無法找到任何POSIX命名信號的PHP實現的實現。我唯一看到的是SysV信號量。PHP命名爲信號量?
(2題)
有沒有辦法從PHP目前訪問命名信號?
有沒有計劃將來的PHP版本?
我一直在環顧四周,但我似乎無法找到任何POSIX命名信號的PHP實現的實現。我唯一看到的是SysV信號量。PHP命名爲信號量?
(2題)
有沒有辦法從PHP目前訪問命名信號?
有沒有計劃將來的PHP版本?
我想簡短的答案是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()
它會成功。
這裏是我的「命名」信號量實現,但我不知道如果你正在尋找一個簡單的字符串到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;
}
有趣的解決方法。我實際上玩過flock()函數,這正是我所需要的,但我很欣賞你的答案。 我是新來的StackOverflow(你可能已經注意到了)。有什麼方法可以將此問題標記爲「不再需要回答」?或者,我是否應該將您的答案標記爲「已接受的答案」? – Ixai 2010-09-29 22:48:16
你應該用你使用的解決方案回答你自己的問題。並將自己的答案標記爲「已接受的答案」 – 2010-09-30 07:40:09
碰撞的可能性有多大?系統上還有其他進程可能會與它衝突? – 2013-09-17 13:21:59
爲什麼你需要訪問信號燈? PHP不支持線程... – 2010-09-27 20:56:38
@Byron:你可以從不同的進程訪問同一個命名的信號量,而不僅僅是線程。 – VolkerK 2010-09-27 21:17:17
我實際上需要鎖定一個PHP和perl腳本寫入的文件。並且可以有幾個運行PHP和perl腳本的實例。我也看到了flock()函數,但我認爲這不會訣竅。 – Ixai 2010-09-27 22:00:47