当使用fsockopen打开php页面时如何获得输出?

时间:2014-10-03 04:38:09

标签: php output fsockopen

当我使用fsockopen打开一个php页面时,代码工作正常,但还有一些其他问题。例如:如果我在a.php中打开b.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);

1 个答案:

答案 0 :(得分: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:标题。

一个真正的应用程序应该解析响应头,我上面的代码只是跳过它们。标题以空行结束,然后将剩余的输出收集到变量中。