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

原文地址:https://www.cnblogs.com/newmiracle/p/13953025.html