如何调试PHP readfile到Amazon Cloudfront的连接超时?

如何调试PHP readfile到Amazon Cloudfront的连接超时?,php,amazon-s3,amazon-cloudfront,readfile,Php,Amazon S3,Amazon Cloudfront,Readfile,直到今天,我还使用PHP的readfile()函数通过CloudFront在S3上输出图像 现在,这个函数有一个超时。在浏览器中粘贴相同的URL时,它只起作用,图像就会显示出来 需要明确的是:直到今天它仍然有效,我不记得修改过PHP的配置。 phpinfo()说: 所以我的问题是:如何调试这个问题?让我们检查一些较小的位,看看是否可以隔离这个问题: 确保允许url\u fopen 确保可以解析DNS请求 确保IPv4连接正常工作* 确保IPv6连接正常工作* 尝试使用使用相同的fopen包装器

直到今天,我还使用PHP的
readfile()
函数通过CloudFront在S3上输出图像

现在,这个函数有一个超时。在浏览器中粘贴相同的URL时,它只起作用,图像就会显示出来

需要明确的是:直到今天它仍然有效,我不记得修改过PHP的配置。
phpinfo()
说:


所以我的问题是:如何调试这个问题?

让我们检查一些较小的位,看看是否可以隔离这个问题:

  • 确保
    允许url\u fopen

  • 确保可以解析DNS请求

  • 确保IPv4连接正常工作*

  • 确保IPv6连接正常工作*

  • 尝试使用使用相同的fopen包装器的
    文件获取内容()

  • *请注意,检查这两项很重要。我曾经有过这样的经历:PHP使用的不同系统级工具使用不同版本的IP。它与
    curl.*
    相当混淆,但
    file\u get\u contents()
    不行

    以下是检查以下各项的脚本:

    <?php
    //Not relevant - Formatting for web browsers...
    if (php_sapi_name() !== "cli") {
        echo "<pre>";
    }
    
    //Ensure PHP is configured correctly.
    $allowUrlFopen = ini_get('allow_url_fopen');
    if($allowUrlFopen){
        echo "Success: allow_url_fopen is enabled.\n";
    } else {
        echo "FAILURE: allow_url_fopen is disabled.\n";
    }
    
    //Check that DNS is working.
    $dns = dns_get_record("www.google.com");
    if($dns){
        echo "Success: DNS has resolved.\n";
    } else {
        echo "FAILURE: DNS did not resolve.\n";
    }
    
    //A Google webserver (IPv4). the IP provided was listed in $dns.;
    $ipv4 = curl_init("http://216.58.217.36");
    curl_setopt($ipv4, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ipv4);
    $statusCode = curl_getinfo($ipv4, CURLINFO_HTTP_CODE);
    //The server responded at all, what it responded with isn't important.
    if($statusCode >= 100){
        echo "Success: Accessing Google's IPv4 web server succeeded.\n";
    } else {
        echo "FAILURE: Accessing Google's IPv4 web server failed.\n";
    }
    
    //A Google webserver (IPv6). The IP provided was listed in $dns.;
    $ipv6 = curl_init("http://2607:f8b0:400f:803::2004");
    curl_setopt($ipv6, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ipv6);
    $statusCode = curl_getinfo($ipv6, CURLINFO_HTTP_CODE);
    if($statusCode >= 100){
        echo "Success: Accessing Google's IPv6 web server succeeded.\n";
    } else {
        echo "FAILURE: Accessing Google's IPv6 web server failed.\n";
    }
    
    //Fetch remote data via fopen url wrappers (file_get_contents utilizies them).
    $file = file_get_contents("http://www.google.com");
    $characters = strlen($file);
    if($characters){
        echo "Success: using fopen wrappers to fetch remote data via a URL succeeded.\n";
    } else {
        echo "FAILURE: using fopen wrappers to fetch remote data via a URL failure.\n";
    }
    
    if (php_sapi_name() !== "cli") {
        echo "</pre>";
    }
    

    让我们检查一些较小的位,看看是否可以将其隔离:

  • 确保
    允许url\u fopen

  • 确保可以解析DNS请求

  • 确保IPv4连接正常工作*

  • 确保IPv6连接正常工作*

  • 尝试使用使用相同的fopen包装器的
    文件获取内容()

  • *请注意,检查这两项很重要。我曾经有过这样的经历:PHP使用的不同系统级工具使用不同版本的IP。它与
    curl.*
    相当混淆,但
    file\u get\u contents()
    不行

    以下是检查以下各项的脚本:

    <?php
    //Not relevant - Formatting for web browsers...
    if (php_sapi_name() !== "cli") {
        echo "<pre>";
    }
    
    //Ensure PHP is configured correctly.
    $allowUrlFopen = ini_get('allow_url_fopen');
    if($allowUrlFopen){
        echo "Success: allow_url_fopen is enabled.\n";
    } else {
        echo "FAILURE: allow_url_fopen is disabled.\n";
    }
    
    //Check that DNS is working.
    $dns = dns_get_record("www.google.com");
    if($dns){
        echo "Success: DNS has resolved.\n";
    } else {
        echo "FAILURE: DNS did not resolve.\n";
    }
    
    //A Google webserver (IPv4). the IP provided was listed in $dns.;
    $ipv4 = curl_init("http://216.58.217.36");
    curl_setopt($ipv4, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ipv4);
    $statusCode = curl_getinfo($ipv4, CURLINFO_HTTP_CODE);
    //The server responded at all, what it responded with isn't important.
    if($statusCode >= 100){
        echo "Success: Accessing Google's IPv4 web server succeeded.\n";
    } else {
        echo "FAILURE: Accessing Google's IPv4 web server failed.\n";
    }
    
    //A Google webserver (IPv6). The IP provided was listed in $dns.;
    $ipv6 = curl_init("http://2607:f8b0:400f:803::2004");
    curl_setopt($ipv6, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ipv6);
    $statusCode = curl_getinfo($ipv6, CURLINFO_HTTP_CODE);
    if($statusCode >= 100){
        echo "Success: Accessing Google's IPv6 web server succeeded.\n";
    } else {
        echo "FAILURE: Accessing Google's IPv6 web server failed.\n";
    }
    
    //Fetch remote data via fopen url wrappers (file_get_contents utilizies them).
    $file = file_get_contents("http://www.google.com");
    $characters = strlen($file);
    if($characters){
        echo "Success: using fopen wrappers to fetch remote data via a URL succeeded.\n";
    } else {
        echo "FAILURE: using fopen wrappers to fetch remote data via a URL failure.\n";
    }
    
    if (php_sapi_name() !== "cli") {
        echo "</pre>";
    }
    

    从发布一些代码开始。请参见l:“如果启用了fopen包装,则URL可以用作此功能的文件名。”有关我链接的副本的详细信息。从发布一些代码开始。请参见l:“如果启用了fopen包装,则URL可以用作此功能的文件名。”有关我链接的副本的详细信息。因此,结果显示:成功:启用了allow\u url\u fopen。成功:DNS已解析。成功:访问Google的IPv4 web服务器成功。失败:访问Google的IPv6 web服务器失败。成功:使用fopen包装器通过URL获取远程数据成功。如何在系统范围内禁用IPv6?这将取决于您的操作系统。你得四处搜索一下。我不愿意在这个答案上添加这样的细节。好吧,无论如何,谢谢你详细的回答!明天我将调查IPv6故障,并在readfile失败的地方开始使用curl。有点奇怪的是,
    file\u get\u contents()
    检查通过了,但是使用失败了-IPv6很可能不是问题所在。您是否可能正在尝试访问https url?我在这里没有提到这一点,但OpenSSL可能有一些东西。我得再加一些支票。对不起,这确实是https!因此,结果是:成功:启用了allow\u url\u fopen。成功:DNS已解析。成功:访问Google的IPv4 web服务器成功。失败:访问Google的IPv6 web服务器失败。成功:使用fopen包装器通过URL获取远程数据成功。如何在系统范围内禁用IPv6?这将取决于您的操作系统。你得四处搜索一下。我不愿意在这个答案上添加这样的细节。好吧,无论如何,谢谢你详细的回答!明天我将调查IPv6故障,并在readfile失败的地方开始使用curl。有点奇怪的是,
    file\u get\u contents()
    检查通过了,但是使用失败了-IPv6很可能不是问题所在。您是否可能正在尝试访问https url?我在这里没有提到这一点,但OpenSSL可能有一些东西。我得再加一些支票。对不起,这确实是https!