如何解决Nginx下UCenter通讯失败的问题
admin
2023-06-12 19:42:11
0

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

现象

最后还是“通信失败”,不过跟踪ucenter的代码,在uc_server/model/misc.php的dfopen()函数中,有如下代码:

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前缀,要直接用网址,类似www.163.com,或者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,重新刷新页面,终于通信成功:

如何解决Nginx下UCenter通讯失败的问题                                             

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

相关内容

热门资讯

半岛电视台:美伊就资产解冻问题... 新华社多哈5月25日电(记者汪强)卡塔尔半岛电视台25日报道,一名了解伊朗高级代表团在多哈会谈情况的...
多地积极探索算电协同创新模式 本报记者 李万晨曦 近日,南方电网广西电网公司联合中国移动广西公司开展了首次算电协同响应实景测试,成...
乘舟向天宫 逐梦揽星河——神舟... 乘舟向天宫  逐梦揽星河 ——神舟二十三号载人飞行任务乘组出征侧记 ■杨子凡 解放军报记者 赵 倩 ...
基恩士相机无图像维修服务商梳理... 导语:在工业自动化设备运维中,基恩士相机作为视觉检测的核心部件,其稳定性直接影响生产线效率。针对无图...
新型3D打印技术问世 机构高频... 新型3D打印技术问世机构高频调研3只概念股 人民财讯5月25日电,2026年以来,3D打印行业内好消...
DeepSeek V4永久降价... 快科技5月25日消息,DeepSeek近日更新API文档,宣布DeepSeek-V4-Pro模型在5...
俄外长告知美方对乌打击计划 新华社莫斯科5月25日电(记者侯鸣)俄罗斯外交部网站25日发布通告说,俄外交部长拉夫罗夫当天同美国国...
伊朗总统下令:恢复互联网至今年... △资料图当地时间25日晚,伊朗总统佩泽希齐扬下令恢复伊朗互联网至今年1月大规模断网前的状态。(总台记...
国家两部门:开展矿山机器人应用... 国家矿山安全监察局综合司 工业和信息化部办公厅关于开展矿山机器人应用验证试点工作的通知 国家矿山安全...
打造“终身学习之城”,杭州积极... 潮新闻客户端 记者 徐婷 俞刘东 通讯员 许慧敏 人工智能时代日新月异,培养适应时代生存发展的人才,...