• phpredis实现简单的消息队列


    phpredis实现简单的消息队列

    本来想用kafka 试用了下 感觉坑巨多 而且项目也不需要那么大的吞吐量所以放弃这个方案了

    <?php
    
    require_once __DIR__ . '/phprediscaozuo.php';
    
    $redis = RedisClient::getInstance();
    
    $ss = $redis->subscribe(array('xiaoxiduilie'), 'callback');
    
    function callback($instance, $channelName, $message)
    {
        $info     = unserialize($message);
        $url      = $info['url'];
      if (is_numeric(strpos(__FILE__, 'phpStudy'))) {
            $yuming  = 'bendilink';
        } else {
            $yuming  = 'fuwuqilink';
        }    
        $url=$yuming.$url;
        $postdata = $info['postdata'];
    
        echo $channelName, "==>", $message, PHP_EOL;
        $info = httprepair($url, $postdata, 'post');
    
        file_put_contents(__DIR__ . '/xiaoxiduilie.log', date("Y-m-d H:i:s") . " " . var_export($info, true) . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
    
    /**
     * 发送HTTP请求方法,目前只支持CURL发送请求
     * @param  string $url    请求URL
     * @param  array  $data   POST的数据,GET请求时该参数无效
     * @param  string $method 请求方法GET/POST
     * @return array          响应数据
     */
    function httprepair($url, $data = '', $method = 'GET')
    {
        $opts = array(
            CURLOPT_TIMEOUT        => 1000,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
        );
    
        /* 根据请求类型设置特定参数 */
        $opts[CURLOPT_URL] = $url;
    
        if (strtoupper($method) == 'POST') {
            $opts[CURLOPT_POST]       = 1;
            $opts[CURLOPT_POSTFIELDS] = $data;
    
            if (is_string($data)) {
                //发送JSON数据
                $opts[CURLOPT_HTTPHEADER] = array(
                    'Content-Type: application/json; charset=utf-8',
                    'Content-Length: ' . strlen($data),
                );
            }
        }
    
        /* 初始化并执行curl请求 */
        $ch = curl_init();
        curl_setopt_array($ch, $opts);
        $data  = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);
    
        //发生错误,抛出异常
        if ($error) {
            file_put_contents(__DIR__ . '/error.log', date("Y-m-d H:i:s") . " " . var_export('<<<<< ' . json_encode($error), 'ERROR', true) . PHP_EOL, FILE_APPEND | LOCK_EX);
        }
    
        return $data;
    }

    直接PHP 运行 常驻内存就可以了 php xx.php &  运行在后台了  这个几千的并发没什么问题的

     ps:一定要先subcribe 监听 频道 然后再publish 频道 不然会publish失败

    我用url 请求 是为了以后更好的业务隔离

  • 相关阅读:
    Windows移动开发(五)——初始XAML
    hdu5242 上海邀请赛 优先队列+贪心
    iOS开发一行代码系列:一行搞定数据库
    MySQL内存调优
    菜鸟nginx源代码剖析 配置与部署篇(一) 手把手实现nginx &quot;I love you&quot;
    配置JBOSS多实例
    MyBatis对数据库的增删改查操作,简单演示样例
    uva 11605
    ios调用dismissViewController的一个小陷阱
    初识ASP.NET---点滴的积累---ASP.NET学习小结
  • 原文地址:https://www.cnblogs.com/newmiracle/p/13953025.html
Copyright © 2020-2023  润新知