블로그 이미지
괴스트

예진이와 고고씽!!

Rss feed Tistory
Dev/php 2010/03/26 17:41

fopen이 안되는 서버에서 회피하는법

크리에이티브 커먼즈 라이선스
Creative Commons License
php.ini 파일에 allow_url_fopen=on으로 설정되어 있으면, URL 주소로 파일 읽어올 때 다음과 같이 처리하면 됩니다.

 


    <?php

    $fp = fopen($url, "r");

    

    while (!feof($fp)) {

        $retVal .= fgets($fp, 1024);

    }

    

    fclose($fp);

    echo($retVal);

    ?>

    

    하지만 allow_url_fopen=off로 설정되어 있는 경우,

    일단 php.ini 파일을 수정하면 됩니다.

    벗뜨~~ 웹 호스팅을 하는 경우 php.ini 파일을 직접 수정할 수 없는 경우가 있죠~

    

    이런 경우의 해결책을 찾아보니 다음과 같이 socket을 이용해 URL주소를 읽어오는 방법이 있었슴다..

    

    <?php

        $url = "URL 주소";

    

        $info = parse_url($url);

        $send = "POST " . $info["path"] . " HTTP/1.1\r\n"

            . "Host: " . $info["host"] . "\r\n"

            . "Content-type: application/x-www-form-urlencoded\r\n"

            . "Content-length: " . strlen($info["query"]) . "\r\n"

            . "Connection: close\r\n\r\n" . $info["query"];

    

        $fp = fsockopen($info[host], 80);

        fputs($fp, $send);

    

        $start = false;

        $retVal = "";

    

        while (!feof ($fp)) {

            $tmp = fgets($fp, 1024);

            if ($start == true) $retVal .= $tmp;

            if ($tmp == "\r\n") $start = true;

        }

    

        fclose($fp);

    

        echo($retVal);

    ?>




 

추가적으로 GET 방식 호출은 다음과 같이 할 수도 있습니다.

 

<?php

    $url = "URL 주소";   

    $info = parse_url($url);

 

    $host = $info["host"];

    $port = $info["port"];

    if ($port == 0) $port = 80;

 

    $path = $info["path"];

    if ($info["query"] != "") $path .= "?" . $info["query"];

 

    $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

 

    $fp = fsockopen($host, $port, $errno, $errstr, 30);

    if (!$fp) {

        echo "$errstr ($errno) <br>\n";

    }

    else {

        fputs($fp, $out);

        $start = false;

        $retVal = "";

 

        while(!feof($fp)) {

            $tmp = fgets($fp, 1024);

            if ($start == true) $retVal .= $tmp;

            if ($tmp == "\r\n") $start = true;

        }

 

        fclose($fp);

        echo $retVal;

    }
?>
저작자 표시
TOTAL 114,291 TODAY 49