когда я использую fsockopen для открытия php-страницы, код работает нормально, но есть и другие проблемы. Например: если я открою b.php в a.php, «echo» не будет работать в b.php, сообщение об ошибке не будет (эти две вещи отлично работают на общей странице). Это очень затрудняет отладку. Как получить вывод на странице b?
Большое спасибо! вот мой код. Я использую 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);
Вот основная структура:
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:
Реальное приложение должно анализировать заголовки ответов, мой код выше просто пропускает их. Заголовок заканчивается пустой строкой, затем он собирает остальную часть вывода в переменную.