fopen을 막아놓은 서버에서 fsockopen 사용에 대한 질문입니다 > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

fopen을 막아놓은 서버에서 fsockopen 사용에 대한 질문입니다 정보

fopen을 막아놓은 서버에서 fsockopen 사용에 대한 질문입니다

본문

fopen을 막아놓은 서버에서 fsockopen 사용에 대한 질문입니다.(검색에 대한 힌트라도 주시면 고맙겠습니다)
주제-쿼리없는 빠른 메인페이지 만들기

아래 링크는 fopen을 막아놓은 서버에서 소켓으로 파일을 열어 지정된 특정 파일을 실행시킨 결과입니다.
바로가기 http://gnusr.com/g4/preload/sock_preload_exec.php (링크에도 결과값과 질문내용이 있습니다)

질문의 요점은
'실행된 결과값(html)을 같은 계정내 제3의 지정 파일에 html로 복사해줄 수 있는가?'입니다.
- 즉 구현된 최신글 부분만 html소스 형태로 다른 파일에 복사해주는 것입니다.

그리고 결과 값에서 헤더 부분을 보이지 않도록 하는 방법을 알고 싶습니다.

*참고로 해뜰녘님께서 알려주신 fopen을 사용해서 절대경로로 접근하는 방법에서는 '실행 결과값의 복사가 아닌 실행파일의 구문자체'가 복사되어 실패하였음(http://www.sir.co.kr/bbs/tb.php/g4_qa/10119)

//호출할 sock_preload_exec.php 파일 소스코드 전체
<?//나스카님 소켓 펑션
function geturl($host,$path) {
$contents="";
$fp = @fsockopen($host, 80, &$errno, &$errstr, 5);
if($fp) {
// 소켓을 이용해서 서버에 html 형태로 테이타를 보냄
fputs ($fp, "GET $path HTTP/1.0\nUser-Agent: Mozilla/4.0\nHost: $host\n\n");

while(!feof($fp)) {
$contents .= fgets($fp,1024);
}
fclose($fp);

return $contents;
}
}
//타 계정 임의의 파일 지정가능 (테스트를 위해 같은 계정내 파일을 지정함)
$htmls=geturl("gnusr.com","/g4/preload/sock_preload_in.php");//실행시킬 파일 지정
echo $htmls;

//위 실행 결과값(html)을 제3의 지정파일에 복사해주는 방법이 있는가??
?>
-끝-

//실제 실행된 sock_preload_in.php 파일 소스 전체
<?
$g4_path = "..";
include_once("$g4_path/common.php");
include_once("$g4[path]/lib/latest.lib.php");
?>

<?=latest("basic", work, 5, 50);?>
-끝-
  • 복사

댓글 전체

답변밑에 달아주신 댓글을 못봤네요..

echo $htmls; 에서 $htmls에 내용이 들어 있죠..

헤더부분 잘라내는 건
$htmls = substr($htmls,strpos("\r\n\r\n",$htmls));
.
헤더랑 <html> 태그 사이에 두줄이 존재하거든요..

저장하는건
$fp=fopen('디렉토리/화일명','w');
fputs($fp,$htmls);
fclose($fp);

이런식이구요..
디렉토리에 other의 쓰기권한이 있어야겠죠..

참고로요..
html 캐쉬화일 만드는 간단한 방법을 예를 들어볼게요.
phpinfo() 함수의 결과를 html화일로 저장한다고 한다면

$htmls=phpinfo();

$fp=fopen('디렉토리/화일명','w');
fputs($fp,$htmls);
fclose($fp);

index.php의 최신글 스킨의 내용을 저장한다면
include_once("$g4[path]/lib/latest.lib.php");
$sql = " select bo_table, bo_subject from $g4[board_table] order by gr_id, bo_table ";
$result = sql_query($sql);
$htmls='';
for ($i=0; $row=sql_fetch_array($result); $i++) {
    $htmls .= latest("basic", $row[bo_table], 5, 70);
    $htmls .=  "<p>\n";
}

$fp=fopen('디렉토리/화일명','w');
fputs($fp,$htmls);
fclose($fp);

특정 php 화일의 실행결과를 저장한다면
ob_start();
include ("../index.php");
$htmls=ob_get_contents();
ob_end_clean();

$fp=fopen('디렉토리/화일명','w');
fputs($fp,$htmls);
fclose($fp);

다 비슷한 내용인데 너무 길게 썼네요..
마지막으로 주의하실것이 경로 문제 입니다..
출력 결과물들이 상대경로로 돼 있을 경우 html의 위치에 따라 화일찾기가 실패 하겠죠..
해뜰녘님 친절한 답변 감사드립니다.
경로문제로 파일의 위치만 바꿔주고 아래 처럼 해주었습니다.
제가 원하는 대로 잘 됩니다.(http://gnusr.com/g4/?ca_id=test 가운데 다중공지부터 스크롤까지 5개의 모듈 부분)

다만, 알려주신 헤더를 잘라내는 부분이 잘 안되고 있습니다.
$htmls = substr($htmls,strpos("\r\n\r\n",$htmls));
번거롭게 해드려 죄송합니다.
부탁드리겠습니다.

<?
//나스카님 소켓 펑션
function geturl($host,$path) {
$contents="";
$fp = @fsockopen($host, 80, &$errno, &$errstr, 5);
if($fp) {
// 소켓을 이용해서 서버에 html 형태로 테이타를 보냄
fputs ($fp, "GET $path HTTP/1.0\nUser-Agent: Mozilla/4.0\nHost: $host\n\n");

while(!feof($fp)) {
$contents .= fgets($fp,1024);
}
fclose($fp);

return $contents;

}
}
$htmls=geturl("gnusr.com","/g4/_preload_in.php");//실행시킬 파일 지정 //개별페이지 접근제어는?
//echo $htmls;//보여줄 필요는 없음

//해뜰녘님 결과값 저장
$fp=fopen('/web2/gnusr/www.gnusr.com/g4/_preload_out.php','w');
fputs($fp,$htmls);
fclose($fp);
?>
에공.. strpos 함수의 인수를 반대로 했네요.. 제 실수로 고생시켜드려 미안하네요..ㅠㅠ

$htmls = trim(substr($htmls,strpos($htmls, "\r\n\r\n")));

이렇게 하시면 되구요..

두개의 빈줄을 없애기 위해 trim 함수도 써줬습니다..

trim 없이
$htmls = substr($htmls,strpos($htmls, "\r\n\r\n")+4);
도 좋구요..
해뜰녘님 대단히 감사합니다.

여기저기 뒤질만큼 뒤진터여서 쪽지까지 드리게되어 죄송합니다.

잘 정리해서 필요한 분들을 위해 올려놓겠습니다.

다시한번 감사의 말씀드립니다.

ps) 구현된 예제와 설명을 간략하게 정리해 놓았습니다.
http://gnusr.com/g4/preload/sock_preload_out.php
© SIRSOFT
현재 페이지 제일 처음으로