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 请求 是为了以后更好的业务隔离

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/19003.html

(0)
上一篇 2021年7月19日 21:37
下一篇 2021年7月19日 21:37

相关推荐

发表回复

登录后才能评论