- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
43 :デフォルトの名無しさん[sage]:2016/05/13(金) 11:46:37.11 ID:/XgzJMPY - >>41
いろいろ面白そうだったので、勝手に作ってみた。 function my_lock($lockfile, $timeout, $maxuser) { // ロック試行 $fp = fopen($lockfile, 'a'); if(flock($fp, LOCK_EX|LOCK_NB)) return $fp; // 待ち人数を数える exec('/usr/sbin/lsof -FC '.escapeshellcmd("\"$lockfile\"").' 2>/dev/null', $out, $ret); if($ret == 0) { if(count($out) > $maxuser) { // 待ち人数過剰 fclose($fp); return false; } } // 時間制限付きロック試行 for($interval = 100, $remain = $timeout * 1000; $remain > 0; $remain-=$interval) { if(flock($fp, LOCK_EX|LOCK_NB)) return $fp; usleep($interval * 1000); } // タイムアウト fclose($fp); return false; }
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
44 :43[sage]:2016/05/13(金) 11:48:10.08 ID:/XgzJMPY - >>43
行数制限で省略したヘッダ /** * 待ち時間・待ち人数制限付きロック * * @param string $lockfile ロックファイルのパス * @param integer $timeout タイムアウト(秒) * @param integer $maxuser 最大ユーザー数(ロック取得済みユーザー及び自分を含む) * @return resource ロックしたファイルのハンドル、またはロックが取得できない場合は FALSE */ lsof のパスは環境に合わせて。 使えない環境(lsof がエラー)では人数制限しない仕様。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
45 :デフォルトの名無しさん[sage]:2016/05/13(金) 11:51:53.48 ID:/XgzJMPY - >>43
連投すまん、ロック試行ループ内の usleep の位置は直前の if の前にするべきだね。
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
52 :デフォルトの名無しさん[sage]:2016/05/13(金) 16:37:32.55 ID:/XgzJMPY - >>49
. の代わりに [^<>] にしてみるとか?
|
- 【PHP】下らねぇ質問はここに書き込みやがれ 5 [無断転載禁止]©2ch.net
54 :デフォルトの名無しさん[sage]:2016/05/13(金) 16:48:42.10 ID:/XgzJMPY - あと * じゃなく + の方がいいな。
とどのつまり "/>([^>]+?)「/" だな。 >>52 で [^<>] と言ったがやっぱ [^>] で充分だ。
|