2013-02-14 3 views
2

Когда я использую file_get_content для загрузки результата выполнения PHP скрипта:Функция file_get_content не работает иногда

//mainfile.php 
    $ctx = stream_context_create(array(
     'http' => array(
      'timeout' => $this->cfg['gp_timeout']/2 
      ) 
     ) 
    ); 
    $url_xml='http://test.server.eu/webgatescript.php?getphoto&param1=1&test=1&param2=2&param3=3'; 
    $webgateResponse=file_get_contents($url_xml,false,$ctx); 

Как я знаю, функция возвращает file_get_contentstring - содержимое файла, если файл не существует возвращается FALSE.

Время от времени функция file_get_content возвращает FALSE, несмотря на то, что я на 100% уверен, что удаленный файл возвратил содержимое (файл xml в моем случае, у меня есть доступ и журналы). Кроме того, file_get_content возвращает FALSE несколько микросекунд после завершения удаленного сценария выполнения, но требуется меньше времени, чем был установлен тайм-аут.

Часть журналов:

10:22:04<?xml version="1.0" encoding="UTF-8"?> 
10:22:16<response><htlName/><lang/><texts/></response> 
10:22:46<?xml version="1.0" encoding="UTF-8"?> 
10:22:58<response><htlName/><lang/><texts/></response> 
10:23:28<?xml version="1.0" encoding="UTF-8"?> 
10:23:29<response><htlName/><lang/><texts/></response> 
10:23:59<?xml version="1.0" encoding="UTF-8"?> 
10:23:59<response><htlName/><lang/><texts/></response> 
10:24:29<?xml version="1.0" encoding="UTF-8"?> 
10:24:29<response><htlName/><lang/><texts/></response> 

Warning: file_get_contents(http://test.server.eu/webgatescript.php?getphoto&param1=1&test=1&param2=2&param3=3): failed to open stream: HTTP request failed! in /home/www/mainfile.php on line 22 

Call Stack: 
    0.0002  93616 1. {main}() /home/www/mainfile.php:0 
     175.5346  109072 2. file_get_contents(string(172), bool, resource(14) of type  (stream-context)) /home/www/mainfile.php:22 

10:24:5910:25:46<?xml version="1.0" encoding="UTF-8"?> 
10:25:47<response><htlName/><lang/><texts/></response> 

Я сделал несколько тестов, один из них был запущен файл mainfile.php в exec (у меня есть оба файла на этом же тестовом сервере, но и на производственном сервере, на котором будут две отдельные системы)

exec("php webgatescript.php >> tom2.log"); 

и каждый случай запуска webgatescript.php регистрирует.

+1

Вы пробовали без тайм-аута? '$ webgateResponse = file_get_contents ($ url_xml);' – HamZa

+0

Вы показываете все предупреждения? При возврате FALSE, file_get_contents могут также запускать предупреждения, которые рассказывают вам больше о том, что произошло. – gd1

+0

Все тезисы проводились с использованием этого же URL-адреса во время (TRUE) цикла, поэтому каждый URL-адрес запроса точно такой же, и answear olso (если возвращается file_get_content). – Skamielina

ответ

1

Я не стал бы полагаться на file_get_contents.

Многие (общие) веб-серверы не позволяют file_get_contents извлекать файлы с других серверов, но позволяют использовать cURL.

$url = 'http://www.stackoverflow.com'; 

// start cURL 
$ch = curl_init($url); 

// set options (http://www.php.net/manual/en/function.curl-setopt.php) 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); // four seconds until connect timeout 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // we want the response in a variable 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); // four seconds until timeout 

$response = curl_exec($ch); // get contents 

curl_close($ch); // close the cURL handle 

Это непросто, но очень надёжно.


Я (возможно) нашел ответ! Как я уже упоминал, вы можете установить параметр, который разрешает или запрещает file_get_contents (и некоторые другие функции) для получения файлов с URL-адреса.

Я нашел Filesystem and Streams Configuration Options. Параметр allow_url_fopen может использоваться для разрешения или запрета открытия URL-адреса с использованием fopen, что также относится к file_get_contents. Он должен быть включен по умолчанию, поэтому я не знаю, почему он не работает для вас.

В любом случае, я все еще про-cURL;)

+0

Есть ли у вас какие-либо доказательства для резервного копирования ваших утверждений о том, что cURL является «более надежным»? Я использую file_get_contents с обертками http stream уже много лет без каких-либо проблем. – Gordon

+0

Спасибо за это, хорошо работает, поэтому это должно быть проблема с функцией 'file_get_contents' ...И еще один вопрос: 'file_get_contents' использует протокол HTTP-связи, поэтому должен быть хороший переход между разными серверами. Почему ты написал, что это не так? – Skamielina

+0

@ Gordon Единственное доказательство, которое у меня есть, - это опыт. Общие веб-серверы часто не разрешают кросс-серверные 'file_get_contents', но позволяют использовать cURL. Это зависит от конфигурации сервера. –

Смежные вопросы