博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unable to find the socket transport "http"
阅读量:6093 次
发布时间:2019-06-20

本文共 1935 字,大约阅读时间需要 6 分钟。

解决Nginx下,UCenter通讯失败的问题。  

现象

上一篇文章《》中,到最后还是“通信失败”,不过跟踪ucenter的代码,在uc_server/model/misc.phpdfopen()函数中,有如下代码:

if(!$fp = @fsocketopen(($scheme == 'https' ? 'ssl' : $scheme).'://'.($scheme == 'https' ? $host : ($ip ? $ip : $host)), $port, $errno, $errstr, $timeout)) {

     $context = array(
       
'http' => array(
          
'method' => $post ? 'POST' : 'GET',
          
'header' => $header,
          
'content' => $post,
          
'timeout' => $timeout,
       
),
    
);
    
$context = stream_context_create($context);
    
$fp = @fopen($scheme.'://'.($scheme == 'https' ? $host : ($ip ? $ip : $host)).':'.$port.$path, 'b', false, $context);

 

if条件内设置断点,即调用fsocketopen()函数失败的时候,此时查看$errstr变量的内容,其值如下:

 

Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?

原因

查看fsocketopen函数的代码:

function fsocketopen($hostname, $port = 80, &$errno, &$errstr, $timeout = 15) {

     $fp = '';
     if
(function_exists('fsockopen')) {
       
$fp = @fsockopen($hostname, $port, $errno, $errstr, $timeout);
    
} elseif(function_exists('pfsockopen')) {
       
$fp = @pfsockopen($hostname, $port, $errno, $errstr, $timeout);
    
} elseif(function_exists('stream_socket_client')) {
       
$fp = @stream_socket_client($hostname.':'.$port, $errno, $errstr, $timeout);
    
}
    
return $fp;
 
}

 

发现其是调用的fsockopen()函数失败,在网上查找,发现大多数都是说fsockopen()函数不支持“http://”这样的host前缀,要直接用网址,类似,或者localhost这样的。

解决

按照网上的说法,我临时修改代码如下:

if(!$fp = @fsocketopen('localhost', $port, $errno, $errstr, $timeout)) {

  //if(!$fp   = @fsocketopen(($scheme == 'https' ? 'ssl' : $scheme).'://'.($scheme ==   'https' ? $host : ($ip ? $ip : $host)), $port, $errno, $errstr, $timeout)) {
    
$context = array(
       
'http' => array(
          
'method' => $post ? 'POST' : 'GET',
          
'header' => $header,
          
'content' => $post,
          
'timeout' => $timeout,
       
),
    
);
    
$context = stream_context_create($context);
    
$fp = @fopen($scheme.'://'.($scheme == 'https' ? $host : ($ip ? $ip : $host)).':'.$port.$path, 'b', false, $context);
 
   $fpflag = 1;
 
}

 

暂时直接将第一个参数固定为localhost,重新刷新页面,终于通信成功:

image.png                                             

 

知道了真正原因,将上述的临时代码用正确的方式修改就很简单了,这里就不浪费笔墨了。

转载地址:http://qrrwa.baihongyu.com/

你可能感兴趣的文章
PDF补丁丁0.3.3版:字符识别结果写入PDF文件功能邀请测试
查看>>
windows连接服务端的域名正常,linux却不通,(针对于负载均衡后端节点设置)...
查看>>
linux 压缩与解压缩
查看>>
iOS状态栏颜色
查看>>
【资源共享】《Rockchip_android7.1_wifi_配置说明V1.4》
查看>>
vue路由-基本使用、重定向、嵌套路由、跳转go、动画、传参、watch、computed
查看>>
UrlHelper
查看>>
MHA故障切换和在线手工切换原理
查看>>
[openStack]使用Fuel安装OpenStack juno的fuel_master
查看>>
QT的安装以及测试是否成功
查看>>
C++中显式、隐式与explicit关键字
查看>>
GOF设计模式汇总
查看>>
input 输入框限制
查看>>
sqlmap命令详解
查看>>
XP远程桌面连接强制登录
查看>>
步步为营 .NET 设计模式学习笔记 八、State(状态模式)
查看>>
ffmpeg的安装
查看>>
Flask基础三
查看>>
C++ 动态内存与智能指针
查看>>
vim进阶:better,faster and stronger
查看>>