使用PHP连接Azure Service Bus队列时遇cURL协议不支持错误
搞定PHP连接Azure Service Bus队列的cURL sb协议错误
嘿,这个错误我之前帮人排查过好多次啦,核心问题就是libcurl压根不支持Azure Service Bus用的sb专有协议,直接用Guzzle这类依赖cURL的工具去连sb://开头的地址肯定会踩坑。下面给你两个靠谱的解决办法:
方法一:用官方Azure Service Bus PHP SDK(最省心)
微软官方出的SDK专门处理这类问题,底层逻辑都帮你封装好了,不用自己跟协议较劲:
- 先通过Composer装包:
composer require azure/service-bus - 然后用SDK的类来操作队列,举个发送消息的例子:
用SDK的话,协议转换、认证这些杂事都不用管,直接调用方法就行。use Azure\ServiceBus\ServiceBusService; use Azure\ServiceBus\Models\BrokeredMessage; // 替换成你自己的Service Bus连接字符串和队列名 $connectionString = "Endpoint=sb://你的命名空间.servicebus.windows.net/;SharedAccessKeyName=你的密钥名;SharedAccessKey=你的密钥值"; $serviceBus = ServiceBusService::createFromConnectionString($connectionString); $message = new BrokeredMessage("这是一条测试消息"); $serviceBus->sendQueueMessage("你的队列名称", $message);
方法二:改用Service Bus的REST API(用标准HTTPS)
如果不想用SDK,也可以直接调它的REST接口,用cURL支持的HTTPS协议:
- 第一步得先弄个SAS令牌(可以在Azure Portal里生成,或者写PHP代码生成,网上有现成的生成逻辑)
- 然后写个cURL请求示例,比如发消息:
这种方式用的是标准HTTPS,完全不会有协议不支持的问题。// 替换成你的命名空间和队列名 $apiUrl = "https://你的命名空间.servicebus.windows.net/你的队列名称/messages"; $sasToken = "SharedAccessSignature sr=你的命名空间.servicebus.windows.net&sig=你的签名&se=过期时间&skn=密钥名称"; $headers = [ 'Content-Type: application/json', "Authorization: $sasToken", ]; $messageContent = json_encode(["content" => "测试REST API发送的消息"]); $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $messageContent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if (curl_errno($ch)) { echo 'cURL出错啦: ' . curl_error($ch); } else { echo '消息发送成功!响应状态码: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE); } curl_close($ch);
补充说明下为啥会报错
Azure Service Bus的sb协议是它自己搞的专有协议,基于AMQP或者TCP实现,而cURL只认HTTP、HTTPS、FTP这些标准协议,所以直接拿cURL去碰sb://的地址,自然就会抛出那个错误啦。
内容的提问来源于stack exchange,提问作者plank223
相关产品推荐
相关产品推荐

