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

PHP 8.1环境下同域名PHP脚本调用php-curl超时问题求助

调试PHP 8.1 curl同域名PHP脚本超时问题的建议

问题概述

服务器环境:Arch Linux + Apache 2.4,部署PHP 7.4/8.0/8.1多版本PHP-FPM,所有PHP配置(模块及配置项)完全一致,但仅PHP 8.1(版本8.1.13-1)出现以下异常:

  • 调用同域名静态文件(HTML/TXT)正常
  • 调用同域名PHP脚本超时无响应,无有效日志记录
  • 调用同一服务器其他域名的PHP脚本正常

具体调试步骤

1. 排查PHP-FPM进程资源限制

  • 检查PHP 8.1的FPM配置文件(如/etc/php8.1/php-fpm.d/www.conf)中的核心参数:
    • pm.max_children:最大子进程数,若当前请求占满所有进程,curl发起的新请求会排队超时
    • listen.backlog:监听队列大小,若队列满则新请求被直接拒绝
  • 实时监控进程状态:
    # 查看当前PHP-FPM8.1进程数
    ps aux | grep php-fpm8.1 | wc -l
    # 若已配置FPM状态页,直接查看详细状态
    curl http://your-domain/php-fpm-status
    

2. 检查Apache连接池与KeepAlive配置

  • 查看Apache主配置(httpd.conf)中的连接控制参数:
    • MaxRequestWorkers:最大并发请求数,超过限制会导致请求阻塞
    • KeepAliveTimeout:若设置过长,会占用连接池资源,导致同域名新请求无法建立连接
  • 临时测试关闭KeepAlive:
    在Apache配置中添加/修改:
    KeepAlive Off
    
    重启Apache后重新运行测试脚本

3. 监控本地回环连接状态

  • 检查端口监听情况(以HTTPS为例):
    ss -tulnp | grep :443
    
  • 请求超时期间查看连接状态:
    ss -t state ESTABLISHED | grep 443
    
    观察是否有大量TIME_WAIT或ESTABLISHED连接堆积,导致无法建立新连接

4. 开启PHP-FPM慢日志定位阻塞点

  • 修改PHP 8.1的FPM配置文件,开启慢日志:
    slowlog = /var/log/php8.1-fpm-slow.log
    request_slowlog_timeout = 2s
    
    重启PHP-FPM后,超时请求会被记录到慢日志中,可直接定位是否有代码或扩展导致阻塞

5. 直接输出curl verbose日志

  • 修改测试脚本,将curl的verbose输出直接打印到stderr,避免文件权限干扰:
    <?php
    define ('HTTP_URL', 'https://'.$_SERVER['HTTP_HOST'].'/any_php_script.php');
    
    $curlHandle = curl_init();
    
    curl_setopt_array($curlHandle, array(
            CURLOPT_URL            => HTTP_URL,
            CURLOPT_VERBOSE        => true,
            CURLOPT_STDERR         => fopen('php://stderr', 'w'),
            CURLOPT_FAILONERROR    => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_CONNECTTIMEOUT => 5,
            CURLOPT_TIMEOUT        => 5,
            CURLOPT_RETURNTRANSFER => true
    ));
    
    $response = curl_exec($curlHandle);
    
    if (curl_errno($curlHandle)) {
            $response =  'Curl error: ' . curl_error($curlHandle);
    }
    
    curl_close($curlHandle);
    
    echo $response;
    
  • 在命令行直接执行脚本,查看实时输出:
    php8.1 curltest.php
    

6. 验证PHP 8.1 curl扩展的依赖与版本

  • 查看PHP 8.1的curl版本:
    php8.1 -i | grep "cURL version"
    
    对比PHP 7.4/8.0的curl版本,排查版本差异导致的兼容性问题
  • 检查curl扩展的依赖库:
    ldd $(php8.1 -r 'echo ini_get("extension_dir");')/curl.so
    
    确认依赖的libcurl、openssl等库与其他PHP版本一致

7. 直接测试PHP-FPM连接(绕过Apache)

  • 使用cgi-fcgi工具直接连接PHP 8.1的FPM监听端口(如127.0.0.1:9001):
    echo -e "GET /any_php_script.php HTTP/1.1\r\nHost: your-domain\r\n\r\n" | cgi-fcgi -bind -connect 127.0.0.1:9001
    
  • 若直接连接FPM正常,说明问题出在Apache与FPM的交互环节,检查Apache的proxy_fcgi配置,比如ProxyPassMatch的timeout参数是否针对PHP 8.1设置异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:55:25