如何调试PHP readfile到Amazon Cloudfront的连接超时?
直到今天,我还使用PHP的如何调试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包装器
readfile()
函数通过CloudFront在S3上输出图像
现在,这个函数有一个超时。在浏览器中粘贴相同的URL时,它只起作用,图像就会显示出来
需要明确的是:直到今天它仍然有效,我不记得修改过PHP的配置。
phpinfo()
说:
所以我的问题是:如何调试这个问题?让我们检查一些较小的位,看看是否可以隔离这个问题:
允许url\u fopen
文件获取内容()
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!