2014-10-03 4 views
1

Когда я использую fsockopen для открытия php-страницы, код работает нормально, но есть и другие проблемы. Например: если я открою b.php в a.php, «echo» не будет работать в b.php, сообщение об ошибке не будет (эти две вещи отлично работают на общей странице). Это очень затрудняет отладку. Как получить вывод на странице b?Как получить вывод при использовании fsockopen для открытия php-страницы?

Большое спасибо! вот мой код. Я использую main.php для вызова main_single_block.php.PS: все работает отлично, за исключением двух вещей, о которых я упоминал выше.

main.php:

$template_url_arr_s = serialize($template_url_arr); 
$fp = fsockopen($sochost, intval($socportno), $errno, $errstr, intval($soctimeout)); 
if (!$fp) { 
    echo "$errstr ($errno) ,open sock erro.<br/>\n"; 
} 
$typename= urlencode($typename);//do url encode (if not, ' 'can not be handled right) 
$template_url_arr_s= urlencode($template_url_arr_s); 
*$out = "GET /main/main_single_block.php?typename=" . $typename . "&templateurlarr=" . $template_url_arr_s . "\r\n";* 
fputs($fp, $out); 
fclose($fp); 
+0

Вы открываете порт HTTP? PHP-скрипты выполняются только в том случае, если вы обращаетесь к ним через веб-сервер, а не как обычные файлы. – Barmar

+0

Кажется, что вы не читаете вывод из сокета. Поэтому, если сценарий что-то повторяет, вы ничего не делаете с ним. – Barmar

+0

Почему вы не используете 'file_get_contents'? – Barmar

ответ

1

Вот основная структура:

template_url_arr_s = serialize($template_url_arr); 
$fp = fsockopen($sochost, intval($socportno), $errno, $errstr, intval($soctimeout)); 
if (!$fp) { 
    echo "$errstr ($errno) ,open sock erro.<br/>\n"; 
} 
$typename= urlencode($typename);//do url encode (if not, ' 'can not be handled right) 
$template_url_arr_s= urlencode($template_url_arr_s); 
$out = "GET /main/main_single_block.php?typename=" . $typename . "&templateurlarr=" . $template_url_arr_s . " HTTP/1.1\r\nHost: $sochost\r\nConnection: close\r\n\r\n"; 
fputs($fp, $out); 
// First read until the end of the response header, look for blank line 
while ($line = fgets($fp)) { 
    $line = trim($line); 
    if ($line == "") { 
     break; 
    } 
} 
$output = ''; 
// Read the body of the response 
while ($line = fgets($fp)) { 
    $output .= $line; 
} 
fclose($fp); 

Я добавил параметр HTTP/1.1 к концу GET линии, требуемого Host: заголовка и Connection: close поэтому мне не нужно разбираться с заголовком ответа Content-Length:.

Реальное приложение должно анализировать заголовки ответов, мой код выше просто проскакивает через них. Заголовок заканчивается пустой строкой, затем он собирает остальную часть вывода в переменную.

+0

Это работает! Спасибо огромное! – weblen

+0

Если он решает вашу проблему, вы должны принять ответ. Нажмите галочку. – Barmar

+0

Привет, не могли бы вы помочь мне с моей новой проблемой на вопрос «Stange string в ответе HTTP при использовании php»? Большое спасибо! – weblen

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

  • Нет связанных вопросов^_^