2017-02-06 21 views
1

До сегодняшнего дня я использовал функцию PHP readfile() для вывода изображения на S3 через CloudFront.Как я могу отлаживать тайм-аут соединения в файле чтения PHP на Amazon Cloudfront?

Теперь я получаю тайм-аут этой функции. При вставке одного и того же URL-адреса в браузере он просто работает, и изображение отображается.

Чтобы быть ясным: он работал до сегодняшнего дня, и я не помню, как изменял конфигурацию PHP. phpinfo() говорит:

enter image description here

Так что мой вопрос действительно: как отладить эту проблему?

+0

Публикация некоторого кода. – Sammitch

+0

См. [Мануала] (http://php.net/manual/en/function.readfile.php) l: «URL-адрес может использоваться как имя файла с этой функцией, если обертки fopen были включены». Больше информации о дублированном я связан. – HPierce

ответ

0

Давайте проверим несколько меньших битов, чтобы увидеть, если мы можем выделить это:

  1. Обеспечить allow_url_fopenis enabled.

  2. Обеспечить разрешение DNS-запросов.

  3. Проверьте соединения IPv4 работать правильно. *

  4. Проверьте соединения IPv6 работать должным образом. *

  5. Попытаться всю вещь с file_get_contents(), который использует те же FOPEN оберток.

* Обратите внимание, что очень важно, чтобы проверить как из них. У меня был опыт в прошлом, когда различные инструменты уровня системы, используемые PHP, используют разные версии IP. Это довольно запутанно с curl_* работает отлично, но file_get_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>"; 
} 

Обязательно исследовать любые сбои с системными инструментами более низкого уровня. Я застрял в проблеме, подобной этому, где все IPv6 на моей операционной системе был тайм-аут. Отключение системы IPv6 в целом было исправлено.

+0

Итак, этот результат получается: Успех: allow_url_fopen включен. Успех: DNS разрешен. Успех: Успешно удалось получить доступ к веб-серверу Google IPv4. НЕИСПРАВНОСТЬ: Не удалось получить доступ к веб-серверу Google IPv6. Успех: использование оберток fopen для получения удаленных данных по URL-адресу. Как отключить систему IPv6? –

+0

Это зависит от вашей ОС. Вам придется искать немного. Мне неудобно добавлять этот уровень детализации в этот ответ. – HPierce

+1

Ну, спасибо за ваш сложный ответ в любом случае! Я буду исследовать ошибку IPv6 завтра и начал использовать curl, где сбой файла readfile. –