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