User should be aware that character '\' is not allowed as part of lock name. The reason why backslash is not allowed is because we are using CreateMutex call as described at http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx. As per this article third parameter cannot have '\' character which is the lock name.
This means below code will not work.
<?php
$ret_val = wincache_lock("C:\WINDOWS\Temp/cache");
echo $ret_val . '<br>';
$ret_val = wincache_unlock("C:\WINDOWS\Temp/cache");
echo $ret_val . '<br>';
?>
wincache_lock
(PECL wincache >= 1.1.0)
wincache_lock — 指定したキーで排他ロックを確保する
説明
bool wincache_lock
( string
$key
[, bool $isglobal = false
] )指定したキーについての排他ロックを確保します。 ロックを確保するまでは、現在のスクリプトの実行はブロックされます。 ロックを確保できたら、その後は他のスクリプトから同じキーのロックを要求があってもそれをブロックします。 現在のスクリプトが wincache_unlock() でロックを解放するまでは他のスクリプトからロックを確保できません。
警告
wincache_lock() および wincache_unlock() を使っていると、FastCGI のようなマルチプロセス環境において PHP スクリプトがデッドロックを引き起こすことがあります。 本当にそれが必要である場合でない限り、これらの関数は使わないようにしましょう。 キャッシュ上でのさまざまな操作の大半は、これらの関数を使う必要のないものです。
パラメータ
-
key -
ロックを取得したいキャッシュ内のキーの名前。
-
isglobal -
ロックのスコープをシステム全体にするかローカルにするかを制御します。 ローカルロックのスコープは、IIS FastCGI のアプリケーションプール内 あるいは同一の親プロセス ID を持つ PHP プロセス群全体となります。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
例
例1 wincache_lock() の使用
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (wincache_lock(“lock_txt_lock”)) { // 排他ロックを確保します
ftruncate($fp, 0); // ファイルを切り詰めます
fwrite($fp, "Write something here\n");
wincache_unlock(“lock_txt_lock”); // ロックを解放します
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
参考
- wincache_unlock() - 指定したキーの排他ロックを解放する
- wincache_ucache_set() - 変数をユーザーキャッシュに追加し、変数が既にキャッシュに存在する場合はそれを上書きする
- wincache_ucache_get() - ユーザーキャッシュに格納された変数を取得する
- wincache_ucache_delete() - 変数をユーザーキャッシュから削除する
- wincache_ucache_clear() - ユーザーキャッシュの中身全体を削除する
- wincache_ucache_exists() - 変数がユーザーキャッシュに存在するかどうかを調べる
- wincache_ucache_meminfo() - ユーザーキャッシュのメモリ使用状況についての情報を取得する
- wincache_ucache_info() - ユーザーキャッシュにキャッシュされたファイルについての情報を取得する
- wincache_scache_info() - セッションキャッシュにキャッシュされたファイルについての情報を取得する
donraman at microsoft dot com ¶
3 years ago
