Как получить вывод при использовании fsockopen для открытия php-страницы?

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

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

основной.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);

person weblen    schedule 03.10.2014    source источник
comment
Вы открываете порт HTTP? PHP-скрипты выполняются только в том случае, если вы обращаетесь к ним через веб-сервер, а не как к обычным файлам.   -  person Barmar    schedule 03.10.2014
comment
Похоже, вы не читаете вывод из сокета. Так что, если сценарий повторяет что-то, вы ничего с этим не делаете.   -  person Barmar    schedule 03.10.2014
comment
Почему бы вам не использовать file_get_contents?   -  person Barmar    schedule 03.10.2014
comment
Да, я открываю http-порт. Я использую этот код для выполнения многопоточной работы, что означает, что пары main_single_block.php работают одновременно после вызова main.php. Мне кажется, что многопоточные вещи работают нормально, но как я могу получить выходное сообщение (например, echo '123') из каждого main_single_block.php для целей отладки.   -  person weblen    schedule 03.10.2014
comment
PS: я узнал многопоточную вещь из Интернета...   -  person weblen    schedule 03.10.2014
comment
Вам нужно прочитать из $fp, например. $output = fgets($fp)   -  person Barmar    schedule 03.10.2014
comment
main.php: подготовьте массив параметров, main_single_block.php использует параметр, каждый main_single_block.php использует один элемент в массиве, предоставленном main.php.   -  person weblen    schedule 03.10.2014
comment
большое спасибо, но как я могу получить $fp из main_single_block.php, будет ли это работать, чтобы сделать $fp глобальным?   -  person weblen    schedule 03.10.2014
comment
Если это в функции, нужно вернуть $fp из функции, а не закрывать. Затем вызывающий может присвоить его переменной и прочитать из нее.   -  person Barmar    schedule 03.10.2014
comment
Переменной нет в main_single_block.php, она просто в main.php, как вы ее написали. Два сценария не имеют общих переменных. main.php просто читает вывод из main_single_block.php, как это делает веб-браузер.   -  person Barmar    schedule 03.10.2014
comment
Спасибо. но я все еще не уверен, как это сделать. Упростим ситуацию. Если в main_single_block.php есть только одна строка, которая является echo 'test'; , как это сделать. Прошу прощения за вопрос новичка :)   -  person weblen    schedule 03.10.2014


Ответы (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: ответа.

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

person Barmar    schedule 03.10.2014
comment
Привет, не могли бы вы помочь мне с моей новой проблемой при вопросе строки Stange в ответе http при использовании php? Большое спасибо! - person weblen; 14.11.2014