You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP8.1本地Apache Curl正常,Bluehost Nginx环境失效及HTTPS问题排查

PHP 8.1下Bluehost共享服务器Curl失效排查方案

问题背景

我有个简单的Curl测试函数,本地Windows Wampserver(Apache+PHP8.1)环境运行正常,但部署到Bluehost共享服务器(Nginx+PHP8.1)后完全失效。联系服务商确认Curl已启用,但无法查看或获取服务器php.ini文件。代码在PHP7.4版本时,本地及Bluehost环境均正常运行,怀疑是PHP8.1的变动引发问题。现需进一步测试排查方法,同时想了解为何使用HTTPS的$curl_url时Curl会失败,目前仅能使用HTTP。

测试代码

test_curl.php

$curl_url = 'http://'.$_SERVER['HTTP_HOST'].'/test_curl_target.php?test_id=999';

$ch = curl_init($curl_url);
curl_setopt($ch, CURLOPT_URL, $curl_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10);      // 设置极短超时
curl_exec($ch);
curl_close($ch);

test_curl_target.php

function log_data($data){// 记录调试信息到文件
  $logPath = $_SERVER["DOCUMENT_ROOT"]."/logs.txt";
  $mode = (!file_exists($logPath)) ? 'w':'a';
  $logfile = fopen($logPath, $mode);
  fwrite($logfile, "\r\n". $data);
  fclose($logfile);
}

log_data('REACHED TARGET PAGE');
$test_id = $_GET['test_id'];
log_data($test_id);

日志情况

本地logs.txt有正常记录,Bluehost服务器的logs.txt始终为空。

排查与测试方法

  • 开启Curl错误输出:在curl_exec前后添加错误捕获代码,直接打印Curl的错误信息,这是最直接的排查方式:
    $response = curl_exec($ch);
    if(curl_errno($ch)){
        echo 'Curl错误:' . curl_error($ch);
    }
    curl_close($ch);
    
  • 查看PHP生效配置:上传一个phpinfo.php文件(内容为<?php phpinfo(); ?>),访问后搜索Curl相关项,虽然拿不到php.ini,但可以查看当前生效的Curl参数(比如curl.cainfo、openssl.cafile等)。
  • 调整超时时间:当前设置的CURLOPT_TIMEOUT_MS为10毫秒,共享服务器网络响应通常比本地慢,这个超时时间过短可能直接导致请求失败,先改为CURLOPT_TIMEOUT 10(10秒)测试。
  • 验证目标页面可用性:在浏览器直接访问http://你的域名/test_curl_target.php?test_id=999,查看logs.txt是否有记录,先确认目标页面本身能正常运行,排除Curl之外的问题。
  • 替换请求方式测试:尝试用file_get_contents替代Curl发起请求,判断是Curl的问题还是服务器网络/权限问题:
    $context = stream_context_create([
        'http' => [
            'timeout' => 10
        ]
    ]);
    file_get_contents($curl_url, false, $context);
    

HTTPS请求失败的可能原因

  • CA证书配置问题:PHP8.1对SSL证书验证更严格,Bluehost服务器可能未配置正确的CA证书路径,导致HTTPS请求证书验证失败。可临时关闭证书验证测试(仅用于排查,生产环境不建议):
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
  • Nginx反向代理拦截:Bluehost的Nginx可能对HTTPS本地请求有拦截规则,或服务器自身Host解析异常,导致HTTPS请求无法正确指向内部页面。
  • SSL扩展兼容性问题:PHP8.1更新了OpenSSL扩展,共享服务器上的旧SSL配置可能不兼容,导致HTTPS连接无法建立。

内容的提问来源于stack exchange,提问作者HDer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:05:19