2014-09-08 3 views
0

Я имею странное поведение на сервере Ubuntu (Nginx php5-FPM стека) следующий код объясняет проблему:file_get_contents url возвращает пустую строку, а fsockopen работает нормально?

<?php 
// WORKS: 
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: www.example.com\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 

// DOES NOT WORK! Return empty string (no error like NULL or False whatsoever). 
echo file_get_contents("http://www.example.com"); 

// allow_ftp_open is On 
echo var_dump(ini_get('allow_url_fopen')); // returns '1' 
?> 

После кода с помощью FOPEN:

<?php 
// get contents of a file into a string 
$filename = "http://www.example.com"; 
$handle = fopen($filename, "r"); 
$contents = fread($handle, filesize($filename)); 
fclose($handle); 
echo $contents; 
?> 

Генерирует это:

Warning: filesize(): stat failed for http://www.example.com in test.php on line 5 

Warning: fread(): Length parameter must be greater than 0 in test.php on line 5 

Если я использую фиксированный размер в fread, результатом будет пустая строка, как с file_get_contents.

Как это может быть, что сокеты работают нормально, но fopen нет? Что мне не хватает?

+0

Что такое allow_url_fopen? – bksi

+0

Устанавливается в положение Вкл. var_dump (ini_get ('allow_url_fopen')) возвращает «1» –

ответ

0

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

if ($fp = fopen('http://www.example.com/', 'r')) { 
    $contents = ''; 
    while ($line = fread($fp, 1024)) { 
     $contents.= $line; 
    } 
} 
+0

, а stream_get_contents возвращает пустую строку «». :( –

+0

fopen должен поддерживать протокол http для открытия URL-адресов (http://php.net/manual/de/function.fopen.php). Я бы использовал сокеты, но я не могу. Моя главная проблема - SoapClient, который, кажется, используйте либо fopen, либо file_get_contents. Когда я пытаюсь создать новый SoapClient ($ url), всегда получаю ошибку: Неустранимая ошибка: исключение SoapFault: [WSDL] SOAP-ERROR: Разбор WSDL: не удалось загрузить из 'http: // .....': начальный тег ожидается, '<' не найден .... Возможно, потому что ответ представляет собой пустую строку (например, с fopen и file_get_contents) –

+0

Да, вы правы. вы пытаетесь с обновленным кодом считывать данные в цикле, потому что возможно, что чтение прекратится после пакета или около того. –

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