单线程类
<?php /** * 单线程执行方法 */ namespace backend\components; class SingleThread { /** * 单线程执行方法 * @param $method string '\backend\components\Tool::test' * @param $param array 方法$method的参数 * @return void */ public static function dealMethod(string $method, ...$param) { $keySign = RedisKey::$storePrefix . 'single::thread::';/*单线程 redis 关键标识符*/ $methodKey = $keySign . $method . '___' . time() . mt_rand(1000, 9999); $paramJson = json_encode($param, JSON_UNESCAPED_UNICODE); RedisKey::set($methodKey, $paramJson);/*方法 和 参数相关信息*/ $waitingKey = $keySign . 'waiting::' . $method; RedisKey::lPush($waitingKey, $methodKey);/*添加写队列*/ $statusKey = $keySign . 'status::' . $method;/*任务状态判断是任务否在执行中*/ if (RedisKey::exists($statusKey)) return true;/*队列执行中,则直接返回*/ $waitingData = RedisKey::rPop($waitingKey);/*待执行的方法*/ while (!empty($waitingData)) { RedisKey::set($statusKey, 1); try { $currentMethod = explode('___', $waitingData); $currentMethod = str_replace($keySign,'',$currentMethod);/*要执行的方法*/ $currentParam = RedisKey::get($waitingData);/*参数*/ RedisKey::del($waitingData); call_user_func_array($currentMethod[0], json_decode($currentParam, true)); } catch (\Exception $e) { RedisKey::del($statusKey);/*任务结束,删除状态*/ } $waitingData = RedisKey::rPop($waitingKey);/*待执行的方法*/ if (empty($waitingData)){ /*执行完*/ RedisKey::del($statusKey);/*任务结束,删除状态*/ RedisKey::del($waitingKey);/*任务结束,删除队列*/ } } } }
集合类
<?php /** * php 使用数据模拟集合数据类型 */ namespace app\components; class Set { /** * 数组转换为集合数据类型(数组去重) * @param array|mixed $data 数组 * @return void */ public static function set($data) { $set = []; /*数组转集合*/ if (is_array($data)) { if (empty($data)) return $set;/*空*/ foreach ($data as $value) { if (!in_array($value, $set)) $set[] = $value; } return $set; } } /** * @param string|int $element * @param $set array 集合 * @return array */ public static function add($element, array $set): array { if (!in_array($element, $set)) { $set[] = $element; } return $set; } /** * 删除元素 * @param string|int $element * @param $set array 集合 * @return array */ public static function remove($element, array $set): array { if (in_array($element, $set)) { foreach ($set as $key => $value) { if ($value == $element) { unset($set[$key]); } } } return array_values($set); } /** * 随机弹出一个元素 * @param $set array * @return void */ public static function pop(array $set) { if (empty($set)) return $set; $len = count($set); $key = mt_rand(0, $len - 1); unset($set[$key]); return array_values($set); } }
标签:set,return,单线程,len,调用,key,array,php From: https://www.cnblogs.com/longfeiPHP/p/18311913