123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- <?php
- namespace easyTask;
- /**
- * Class Queue
- * @package easyTask
- */
- class Queue
- {
- /**
- * 进程锁
- * @var Lock
- */
- private $lock;
- /**
- * 队列文件
- * @var string
- */
- private $queFile;
- /**
- * 构造函数
- * @param string $name
- * @throws
- */
- public function __construct($name = 'queue')
- {
- //创建进程锁
- $this->lock = new Lock($name);
- //创建队列文件
- $path = Helper::getQuePath();
- $file = $path . '%s.dat';
- $this->queFile = sprintf($file, md5($name));
- if (!file_exists($this->queFile))
- {
- if (!file_put_contents($this->queFile, '[]', LOCK_EX))
- {
- Helper::showError('crate queFile failed,please try again');
- }
- }
- }
- /**
- * 向队列投递数据
- * @param string $item
- */
- public function push($item)
- {
- $this->lock->execute(function () use ($item) {
- //read
- $content = file_get_contents($this->queFile);
- $queue_data = $content ? json_decode($content, true) : [];
- $queue_data = is_array($queue_data) ? $queue_data : [];
- //write
- array_push($queue_data, $item);
- if (!file_put_contents($this->queFile, json_encode($queue_data)))
- {
- Helper::showError('failed to save data to queue file');
- }
- });
- }
- /**
- * 从队列弹出数据
- * @return string|null
- */
- public function shift()
- {
- return $this->lock->execute(function () {
- //read
- $content = file_get_contents($this->queFile);
- $queue_data = $content ? json_decode($content, true) : [];
- $queue_data = is_array($queue_data) ? $queue_data : [];
- //shift+write
- $value = array_shift($queue_data);
- if (!file_put_contents($this->queFile, json_encode($queue_data)))
- {
- Helper::showError('failed to save data to queue file');
- }
- return $value;
- });
- }
- }
|