Skip to content




https 페이지 읽어오는 방법?(fopen?)



아래와 같이 뻔한 소스인데... https 가져오는 방법이 없나요? 

일단 제가 원하는 것은 https 사이트 페이지의 정보를 긁어오는 것이 목적입니다. 

메뉴얼보면 PHP4.3.0 이상에서 openssl이 깔려있으면 fopen으로 된다는데 지금 4.3.0 정식버전이 안나왔잖아요...결국 방법이 없는건가요? 
4.3.0RC2 깔다보니깐 자꾸 에러나고 버그게시판에 글 잔뜩 올라와있구... 그래서 걱정입니다. 
물론 아직 까는데 성공하지도 못했지만요.(gd 쪽에서 계속 에러나네요) 

아무튼 fsockopen 도 잘 작동하지 않고요. 

무슨 다른 방법이 없을까요? 
여러 경험많으신 고수님들! 
제가 취할수 있는 방법이 php-4.3.0RC2 잘 깔아서 잘 되길 바라는 방법밖에 없나요? 
다른 방법은 없나요? 
혹시 아시는 방법이 있으면 좀 부탁 좀 드립니다. 


        $openurl = "https://www.test.com"; 
        //리모트의 URL Page를 임시파일로 받아온다. 
        $file = fopen($openurl, "r"); //여기서 부터 에러가 쭈루루룩 나옵니다. 
        if (!$file) //파일을 받아오지 못했을 경우 
        { 
                $i = 0 ; 
                while (!feof($file) && $i < 2000)  //한줄씩 파일끝까지 읽는다. 뒤에 2000 넣은 것은 작동이 안될경우 무한루프에 빠지더군요. 그래서... 이렇게무식하게... ㅡ.ㅡ; 
                { 
                        $line = fgets($file, 1024); //한줄의 1024byte만큼 잘라내고  받아온다. 
                        echo $line; 
                        $i++; 
                } 
        } 
        fclose($file); 





php-4.3.0RC2 깔았지만 여전히 안되네요. 
정말 답답한 노릇입니다. 
누가 좀 안되면 안된다 말해주세요. 이거 붙잡고 벌써 일주일째... 

curl 이 솔루션이군요. 
이거 정말 다 돼네요. 아무도 대답안해주신 덕분에 좋은 공부했습니다. 감사합니다. ㅡ.ㅡ;

참고 사이트 
http://man.phpschool.com/manual/kr/ref.curl.php 
http://curl.sourceforge.net/ 
그럼 좋은 하루 되셈.








다음은 fsockopen()과 stream_socket_client()같은 스트림 기반 소켓 함수를 사용하기 위해 PHP가 내장하고 있는 다양한 URL 스타일의 소켓 전송 목록이다. 이런 전송들은 Sockets Extension에 적용되지 않는다.

설치된 PHP 버전안에 사용가능한 전송 리스트를 보려면 stream_get_transports()를 사용하라.

인터넷 도메인: TCP, UDP, SSL, TLS

PHP 3, PHP 4. ssl:// & PHP 4.3이후의 tls://

참고: 전송이 표시되지 않으면 tcp://라고 가정할것이다.

  • 127.0.0.1

  • fe80::1

  • www.example.com

  • tcp://127.0.0.1

  • tcp://fe80::1

  • tcp://www.example.com

  • udp://www.example.com

  • ssl://www.example.com

  • tls://www.example.com

인터넷 도메인 소켓은 목표 주소에 더하여 포트 번호가 올것을 예상할수 있다. fsockopen()의 경우 이것은 두번째 인수에서 설정되고 따라서 전송 url의 구성에 영향을 주지 않는다. stream_socket_client()와 이와 관련된 함수는 전통적인 URL을 갖는다. 포트 번호는 전송 URL의 끝에 콜론으로 구분되어 덧붙여진다.

  • tcp://127.0.0.1:80

  • tcp://[fe80::1]:80

  • tcp://www.example.com:80

포트 번호를 갖는 IPv6 숫자 주소: 위 예제중 두번째는, IPv4의 호스트명 예제가 콜른과 포트번호의 추가와는 별개로 남겨져있는데 반하여, IPv6 주소는 대괄호: [fe80::1]에 둘러쌓여 있다. 이것은 IPv6 주소에서 사용되는 콜론과 포트번호를 구분하기 위해 사용되는 콜론을 구별하기 위한 것이다.

ssl:// 과 tls:// 전송은 (openssl 지원이 PHP안에 컴파일되었을때만 가용) SSL 암호화를 포함하는 tcp:// 전송의 확장이다. PHP 4.3.0이후에 OpenSSL 지원은 PHP와 정적으로 컴파일되어야 한다. PHP 5.0.0 이후부터는 모듈이건 정적이건 아무거나 컴파일 되어 사용될수 있을것이다.

표 L-1. ssl://와 tls://에 대한 환경 옵션 (PHP 4.3.2 이후 버전)

이름용도기본값 
verify_peerTRUE or FALSE. 사용되는 SSL 인증의 조회를 요구FALSE 
allow_self_signedTRUE or FALSE. 자체-사인된 인증을 허용FALSE 
cafile원격단의 신원을 인증하기 위한 verify_peer 환경 옵션으로 사용될수 있는 로컬 파일시스템상의 인증 증명서 파일의 위치  
capathcafile에서 설정되지 않거나 인증서를 거기서 찾을수 없다면, capath에 의해 지정된 디렉토리에서 적절한 인증서를 검색한다. capath는 정확하게 해쉬된 인증서 디렉토리여야 한다.  
local_cert파일시스템 상의 로컬 인증서 파일로의 경로. 인증과 개인키를 포함하는 인코딩된 PEM 파일이 되어야 한다. 이것은 요구자의 인증 체인을 선택적으로 포함할수 있다.  
passphrase인코딩된 local_cert파일의 패스구절(passphrase).  
CN_matchCommon Name 이 와야 함. PHP는 제한된 와일드카드 비교를 수행할것이다. Common Name이 이와 일치하지 않으면, 접속시도가 실패할것이다.  

참고: ssl://은 https://와 ftps:// 래퍼를 위한 중요한 전송이기 때문에, ssl://에 적용되는 환경 옵션은 https://와 ftps://에도 적용된다.
















안녕하세요. 
접근하고자 하는 싸이트에서 POST 로 id와 pass1을 ./login.asp 로 보낸다는 엄청난 사실을 알아냈습니다. 그리고, 소켓접속 할 수 있는 php 소스를 드디어 찾아 냈습니다. 그런데... 도무지 어느 부분에 id와 pass1을 삽입해야 하는지 도통 알 수가 없군요. 도사님들 부디 중생을 구원해 주소서... 





#usage: 
$r = new HTTPRequest($url); 
echo $r->DownloadToString(); 



class HTTPRequest 

    var $_fp;        // HTTP socket 
    var $_url;        // full URL 
    var $_host;        // HTTP host 
    var $_protocol;    // protocol (HTTP/HTTPS) 
    var $_uri;        // request URI 
    var $_port;        // port 
    
    // scan url 
    function _scan_url() 
    { 
        $req = $this->_url; 
        
        $pos = strpos($req, '://'); 
        $this->_protocol = strtolower(substr($req, 0, $pos)); 
        
        $req = substr($req, $pos+3); 
        $pos = strpos($req, '/'); 
        if($pos === false) 
            $pos = strlen($req); 
        $host = substr($req, 0, $pos); 
        
        if(strpos($host, ':') !== false) 
        { 
            list($this->_host, $this->_port) = explode(':', $host); 
        } 
        else 
        { 
            $this->_host = $host; 
            $this->_port = ($this->_protocol == 'https') ? 443 : 80; 
        } 
        
        $this->_uri = substr($req, $pos); 
        if($this->_uri == '') 
            $this->_uri = '/'; 
    } 
    
    // constructor 
    function HTTPRequest($url) 
    { 
        $this->_url = $url; 
        $this->_scan_url(); 
    } 
    
    // download URL to string 
    function DownloadToString() 
    { 
        $crlf = "\r\n"; 
        
        // generate request 
        $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf 
            .    'Host: ' . $this->_host . $crlf 
            .    $crlf; 
        
        // fetch 
        $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port); 
        fwrite($this->_fp, $req); 
        while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp)) 
            $response .= fread($this->_fp, 1024); 
        fclose($this->_fp); 
        
        // split header and body 
        $pos = strpos($response, $crlf . $crlf); 
        if($pos === false) 
            return($response); 
        $header = substr($response, 0, $pos); 
        $body = substr($response, $pos + 2 * strlen($crlf)); 
        
        // parse headers 
        $headers = array(); 
        $lines = explode($crlf, $header); 
        foreach($lines as $line) 
            if(($pos = strpos($line, ':')) !== false) 
                $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1)); 
        
        // redirection? 
        if(isset($headers['location'])) 
        { 
            $http = new HTTPRequest($headers['location']); 
            return($http->DownloadToString($http)); 
        } 
        else 
        { 
            return($body); 
        } 
    } 
}