2014-11-14 1 views
-1

내 PHP 코드가 제대로 작동했습니다. 갑자기 응답 데이터에 매우 이상한 문자열이 생겼습니다. 모든 응답 데이터는 아래와 같습니다. "87,0"및 "3e, 0"은 어디에서 왔습니까? 내가 어떻게 그들을 제거 할 수 있습니까? (그들은 표시되기 전에 모든 응답 데이터 후.)PHP를 사용할 때 HTTP 응답의 stange 문자열

HTTP/1.1 200 OK 
Date: Fri, 14 Nov 2014 01:57:40 GMT 
Server: Apache 
X-Powered-By: PHP/5.4.34 
Connection: close 
Transfer-Encoding: chunked 
Content-Type: text/html 

87 
a:1:{i:0;s:116:"http://www.nytimes.com/2014/09/15/sports/basketball/united-states-wins-fiba-world-cup-title-in-a-rout-of-serbia.html";} 
0 

HTTP/1.1 200 OK 
Date: Fri, 14 Nov 2014 01:57:40 GMT 
Server: Apache 
X-Powered-By: PHP/5.4.34 
Connection: close 
Transfer-Encoding: chunked 
Content-Type: text/html 

3e 
a:1:{i:0;s:44:"http://www.bbc.com/news/in-pictures-29204063";} 
0 


foreach($template_arr as $tkey => $template) 
    { 
     $keyword = self::getKeyword($template, $typename); 
     $keyword = urlencode($typename);//encode because it is going to be send through url   
     $urlPre = self::getURLPre('news'); 
     $urlrule = self::getURLRule($template); //actually it is used in both siteSearch and urlrule,but urlrule seems unnecessary 

     $s = stream_socket_client("$sochost:$socportno", $errno, $errstr, $soctimeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT); 
     if ($s) 
     { 
      $sockets[$template] = $s; 
      $out = "GET /DataAC/Search/Search_Bridge_G.php?keyword=$keyword&resultSize=$resultSize&urlPre=$urlPre&urlrule=$urlrule&template=$template"; 
      $out.= " HTTP/1.1\r\n"; 
      $out.= "Connection: Close\r\n"; 
      $out.= "Host:$sochost\r\n\r\n"; 
      fwrite($s, $out); 
     } 
     else 
     { 
      echo "$errstr ($errno) ,open sock on search keyword @ $keyword on template @ $tempalte erro when open search bridge.<br/>\n"; 
     } 
    } 

    while (count($sockets)) 
    { 
     $read = $sockets; 
     $w = null; 
     $e = null; 
     stream_select($read, $w, $e, $soctimeout); 
     if (count($read)) 
     { 
      /* stream_select generally shuffles $read, so we need to 
      compute from which socket(s) we're reading. */ 
      foreach($read as $r) 
      { 
       $template = array_search($r, $sockets); 
       $data = fread($r, $convenient_read_block); 

       // A socket is readable either because it has 
       // data to read, OR because it's at EOF. 

       if (strlen($data) == 0) 
       { 
        //echo "Template " . $template . " closes at " . date('h:i:s') . "</br>"; 
        $responseData = $result[$template]; 
        echo "!!!!!!!!!!!!!!!$responseData!!!!!!!!!!!!!!!"; 
        $responseArray=unserialize(substr($responseData,strpos($responseData,"\r\n\r\n")+4)); //get serialize array from respose data and unserialize it ,"+4" means we don't need \r\n\r\n 
        //var_dump($responseArray); 

        $urlarr = $responseArray; 

        // assemble result array start 
        if (!empty($urlarr)) 
        { 
         $template_url_arr[$template] = $urlarr[0]; 
         $timenow = date('Y-m-d H:i:s', time()); 
         echo "</br>######### Machine search : keyword:@" . $typename . " target url:" . $urlarr[0] . " timestamp: $timenow" . "#########</br>"; 
        } 
        else 
        { 
         echo "</br> ######### Template url arr empty when query keyword @" . $keyword . " under template @" . $template . " #########</br>";        
        } 
        // assemble result array end 
        fclose($r); 
        unset($sockets[$template]); 
       } 
       else 
       { 
        if(!isset($result[$template]))//init the array element or there will be a warning 
        $result[$template]= ""; 
        $result[$template].= $data; 
       } 
      } 
     } 
     else 
     { 
      /* A time-out means that *all* streams have failed 
      to receive a response. */ 
      echo "Time-out!\n"; 
      break; 
     } 
    } 


script:Search_Bridge_G.php 

require_once '../../global.php'; 
//require_once('UTIL/MyFileUtil.php'); 
//require_once('UTIL/MyDocUtil.php'); 
require_once 'DataAC/Search/GetGSearchLink.php'; 
error_reporting(E_ALL); 


$keyword=$_GET['keyword']; 
$keyword=preg_replace('/\s+/', '%20', trim($keyword)); //replace ' ' with %20 
$resultSize=$_GET['resultSize']; 
$urlPre=$_GET['urlPre']; 
$urlrule=$_GET['urlrule']; 
$template=$_GET['template']; 

$ant = new \DataGenerator\GetLinkG\GetGSearchLink($keyword,$resultSize, $urlPre,$urlrule); 
$urlarr = $ant->getFilteredURL($template); 
/* 
echo "</br>key:".$keyword."</br>"; 
echo "</br>rsize:".$resultSize."</br>"; 
echo "</br>urlpre:".$urlPre."</br>"; 
echo "</br>urlrule:".$urlrule."</br>"; 
echo "</br>templa:".$template."</br>"; 
*/ 
//var_dump($urlarr); 
echo serialize($urlarr); 
+0

은 그게 스크립트 또는 원격 서버의 응답? 내 자신의 스크립트의 – Cheery

+0

응답. 스크립트는이 작업을 "echo serialize ($ urlarr);" 스크립트에서 배열을 가져올 수 있습니다. – weblen

+0

출력을 어디에서 만드십니까? – Cheery

답변

1

HTTP 서버가 사전에 Content-Length:을 판단 할 수없는 경우, 예를 들어 반대로 출력이 동적 스크립트에 의해 생성 될 때 정적 파일로 출력하면 청크로 출력됩니다 (Transfer-Encoding: chunked 헤더로 표시). 각 청크는 16 진수로 표현 된 길이가 접두사로 붙습니다. 그것들은 당신이 보는 "이상한 끈"입니다. 정확한 세부 사항에서 확인할 수 있습니다

RFC 7230: Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

+0

대단히 감사합니다! 그리고 이것은 http 서버 구성과 관련이 있습니까? 내 구문 분석 코드가 단지 yestoday에 잘 작동하기 때문에. 이제 응답 데이터에 길이 숫자 util이 포함되지 않았던 것 같습니다. – weblen

+1

@weblen chunked가 어떻게 비활성화 될 수 있는지 http://serverfault.com/questions/155558/how-can-i-disable-transfer-encoding-chunked-in-apache-with-http-1-1-responses를 참조하십시오. 아파치. 그렇다면 자신의 HTTP 클라이언트를 구현하는 대신 cURL을 사용하는 것이 어떻습니까? – Barmar

+0

나는 PHP에서 멀티 스레드를 시뮬레이트하려고한다. 위의 코드는 인터넷에서 가져온 것입니다. 나는 컬을 시도 할 것이다. 고맙습니다!!! – weblen