function receiveMessage($queue) { while (true) { if (Redis::setnx('cinnamon-lock-' . $queue, 1)) { Redis::expire('cinnamon-lock-' . $queue, 1); $return = Redis::zrange('cinnamon-queue-' . $queue, 0, 1); if (isset($return[0])) { $return = $return[0]; if ($return) { Redis::zrem('cinnamon-queue-' . $queue, $return); } } else { $return = null; } Redis::del('cinnamon-lock-' . $queue); try { if ($return) { return json_decode($return, true); } } catch (Exception $e) { continue; } return null; } usleep(20000); } return null; }
use Framework\Config; use Framework\Queue\Driver\RedisDriver; use Framework\Exception\FrameworkException; use Framework\Queue\QueueProcessor; use Framework\Input; use Framework\Route; use Framework\Queue\Driver\Driver; $r = Redis::getInstance(); if (!isset($argv[1])) { return; } $ip = $argv[1]; $process = $r->get('cinnamon-process-' . $ip); if ($process == null) { Redis::set('cinnamon-process-' . $ip, date('U')); Redis::expire('cinnamon-process-' . $ip, 1200); try { if (!$rs instanceof Driver) { throw FrameworkException::internalError('Queue Driver Not Set'); } QueueProcessor::getInstance()->setDriver($rs)->setAsReceiver(); $message = $rs->receiveMessage('route'); if (!$message) { continue; } Input::bind($message); Route::reset(); Route::setSkipMain(); include __APP__ . "/route.php"; $r->subscribe('cinnamon-process', function ($message, $channel) use($r) { $tasks = $r->zrange('cinnamon-queue-' . $channel, 0, 10);