首页 > 编程语言 >分享php两个实用类:单线程调用和集合类

分享php两个实用类:单线程调用和集合类

时间:2024-07-19 17:07:02浏览次数:10  
标签:set return 单线程 len 调用 key array php

单线程类

<?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

相关文章

  • 【开源分享】2024PHP在线客服系统源码(全新UI+终身使用+安装教程)
    PHP在线客服系统核心功能用户留言协同工作:留言后,用户能够享受在线咨询、订单查询等服务;登录状态也用于权限控制,确保不同用户访问合适的资源。咨询处理作用:提供实时或异步的客服咨询功能,允许用户向客服发送问题并接收回复。重要性:是客服系统的核心功能,直接影响用户体验和满意......
  • PHP curl 模拟GET请求接口报错HTTP Status 400 – Bad Request 问题
    网上查的解决方案:https://blog.csdn.net/sunsijia21983/article/details/123204143问题:PHP用curl模拟GET请求接口报错HTTPStatus400–BadRequesthttp://xxx/api/getZList?page=1&limit=20&zName=测试参数zName是英文、数字的时候都不会报错,输入汉字就报错400;解决方案:h......
  • PHP编程中的接口与性状:实现代码解耦与功能复用的关键技术
    本文由ChatMoney团队出品在PHP编程中,接口是一种定义对象之间交互契约的强大工具。其核心目的不是让一个对象紧耦合地依赖另一个对象的特定身份,而是基于另一对象的能力进行交互。通过接口,我们的代码可以实现与依赖的解耦,从而允许我们的代码与任何实现了相应接口的第三方代码协......
  • PHP接口与性状的优雅应用
    本文由ChatMoney团队出品在PHP编程中,接口是一种定义对象之间交互契约的强大工具。其核心目的不是让一个对象紧耦合地依赖另一个对象的特定身份,而是基于另一对象的能力进行交互。通过接口,我们的代码可以实现与依赖的解耦,从而允许我们的代码与任何实现了相应接口的第三方代码协......
  • windows远程桌面打开rdp 调用显卡
    -----------------------------------------------------------------------------------------------------------前情提要:服务器在公网环境,带宽只有30M。远程桌面多开玩游戏,设置RDP服务端使用GPU。压缩传输带宽避免造成卡顿。如果是内网,也可以用,还可以提供一个注册表键值,修......
  • dockerfile来快速部署一个php服务
    1.创建一个php服务需要的dockfilevimphp_dockerfile#UsethelatestUbuntuimageasthebaseimage.FROMubuntu:20.04 #Setenvironmentvariables.ENVDEBIAN_FRONTEND=noninteractive #Updateandinstallnecessarypackages.RUNapt-getupdate&&\  ......
  • 易优CMS模板标签uitype栏目调用在模板文件index.htm中调用uitype标签,实现指定栏目可视
    【基础用法】标签:uitype描述:栏目编辑,比uitext、uihtml、uiupload标签多了一个typeid属性,使用时结合html一起才能完成可视化布局,只针对具有可视化功能的模板。用法:<divclass="eyou-edit"e-id="文件模板里唯一的数字ID"e-page='文件模板名'e-type="type">{eyou:uitypetypeid=......
  • PHP 调用 JD 详情 API 接口:数据获取新途径
    在当今数字化的商业环境中,准确和及时的数据对于企业的决策和运营至关重要。京东(JD)作为国内知名的电商平台,其商品详情数据具有极高的价值。通过使用PHP调用JD详情API接口,为我们开辟了一条全新的数据获取途径。一、JD详情API接口简介JD详情API接口提供了丰富的商......
  • 利用 PHP 获取淘宝详情 API 接口的实战技巧
    在电商领域的开发中,获取淘宝商品详情数据是一项关键任务。通过PHP来调用淘宝详情API接口,可以为我们的应用增添丰富的功能和价值。以下将分享一些实战技巧,帮助您更高效地实现这一目标。一、前期准备工作注册淘宝开放平台账号并申请API权限:确保您具备合法的访问权限。......
  • PHP由mb_strpos与mb_substr执行差异导致的小trick
    前言这个其实不算啥大洞,主要是我遇到两次了,第一次是在黄河流域做那个题的时候,还有一次是ctfshow西瓜杯的题,做到了gxngxngxn师傅出的套皮。就以这道ezphp入手吧。分析&EXP一看传参传个gxngxngxn就能读/etc/passwd,事实也的确如此。但是我们显然是要做到打这个反序列化做到任意......