2014-10-03 6 views
1

PHP 페이지를 열 때 fsockopen을 사용하면 코드가 제대로 작동하지만 몇 가지 다른 문제가 있습니다. 예 : a.php에서 b.php를 열면 "echo"가 b.php에서 작동하지 않으며 오류 메시지도 표시되지 않습니다 (이 두 가지는 공통 페이지에서 잘 작동 함). 이것은 디버그를 매우 어렵게 만듭니다. 페이지 b에서 출력을 얻는 방법?fsockopen을 사용하여 PHP 페이지를 열 때 출력을 얻는 방법은 무엇입니까?

고맙습니다. 여기 내 코드가있다. main.single_block.php.PS를 호출하기 위해 main.php를 사용합니다 : 위에서 언급 한 2 가지를 제외하고는 모든 것이 잘 작동합니다.

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

여기 기본 구조이다 : 나는 GET 라인, 필요한 Host: 헤더의 끝에 HTTP/1.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); 

이, 그리고 Connection: close 헤더가 없으므로 응답의 Content-Length: 헤더를 구문 분석 할 필요가 없습니다.

실제 응용 프로그램은 응답 헤더를 구문 분석해야합니다. 위 코드는 건너 뜁니다. 헤더는 공백 행으로 끝나고 나머지 출력을 변수로 수집합니다.

+0

그것은 작동합니다! 정말 고맙습니다! – weblen

+0

문제가 해결되면 대답을 수락해야합니다. 체크 표시를 클릭하십시오. – Barmar

+0

안녕하세요, 제 질문에 "PHP를 사용할 때 http 응답의 Stange 문자열"이라는 새로운 문제를 도와 주시겠습니까? 고마워요! – weblen