czaks
8 years ago
2 changed files with 88 additions and 0 deletions
@ -0,0 +1,39 @@ |
|||||
|
<?php |
||||
|
class Lock { |
||||
|
function __construct($key) { global $config; |
||||
|
if ($config['lock']['enabled'] == 'fs') { |
||||
|
$key = str_replace('/', '::', $key); |
||||
|
$key = str_replace("\0", '', $key); |
||||
|
|
||||
|
$this->f = fopen("tmp/locks/$key", "w"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Get a shared lock |
||||
|
function get($nonblock = false) { global $config; |
||||
|
if ($config['lock']['enabled'] == 'fs') { |
||||
|
$wouldblock = false; |
||||
|
flock($this->f, LOCK_SH | ($nonblock ? LOCK_NB : 0), $wouldblock); |
||||
|
if ($nonblock && $wouldblock) return false; |
||||
|
} |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
// Get an exclusive lock |
||||
|
function get_ex($nonblock = false) { global $config; |
||||
|
if ($config['lock']['enabled'] == 'fs') { |
||||
|
$wouldblock = false; |
||||
|
flock($this->f, LOCK_EX | ($nonblock ? LOCK_NB : 0), $wouldblock); |
||||
|
if ($nonblock && $wouldblock) return false; |
||||
|
} |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
// Free a lock |
||||
|
function free() { global $config; |
||||
|
if ($config['lock']['enabled'] == 'fs') { |
||||
|
flock($this->f, LOCK_UN); |
||||
|
} |
||||
|
return $this; |
||||
|
} |
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
<?php |
||||
|
|
||||
|
class Queue { |
||||
|
function __construct($key) { global $config; |
||||
|
if ($config['queue']['enabled'] == 'fs') { |
||||
|
$this->lock = new Lock($key); |
||||
|
$key = str_replace('/', '::', $key); |
||||
|
$key = str_replace("\0", '', $key); |
||||
|
$this->key = "tmp/queue/$key/"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
function push($str) { global $config; |
||||
|
if ($config['queue']['enabled'] == 'fs') { |
||||
|
$this->lock->get_ex(); |
||||
|
file_put_contents($this->key.microtime(true), $str); |
||||
|
$this->lock->free(); |
||||
|
} |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
function pop($n = 1) { global $config; |
||||
|
if ($config['queue']['enabled'] == 'fs') { |
||||
|
$this->lock->get_ex(); |
||||
|
$dir = opendir($this->key); |
||||
|
$paths = array(); |
||||
|
while ($n > 0) { |
||||
|
$path = readdir($dir); |
||||
|
if ($path === FALSE) break; |
||||
|
elseif ($path == '.' || $path == '..') continue; |
||||
|
else { $paths[] = $path; $n--; } |
||||
|
} |
||||
|
$out = array(); |
||||
|
foreach ($paths as $v) { |
||||
|
$out []= file_get_contents($this->key.$v); |
||||
|
unlink($this->key.$v); |
||||
|
} |
||||
|
$this->lock->free(); |
||||
|
return $out; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Don't use the constructor. Use the get_queue function. |
||||
|
$queues = array(); |
||||
|
|
||||
|
function get_queue($name) { global $queues; |
||||
|
return $queues[$name] = isset ($queues[$name]) ? $queues[$name] : new Queue($name); |
||||
|
} |
Loading…
Reference in new issue