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);?>
-끝-
주제-쿼리없는 빠른 메인페이지 만들기
아래 링크는 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의 위치에 따라 화일찾기가 실패 하겠죠..
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);
?>
경로문제로 파일의 위치만 바꿔주고 아래 처럼 해주었습니다.
제가 원하는 대로 잘 됩니다.(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);
도 좋구요..
$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
여기저기 뒤질만큼 뒤진터여서 쪽지까지 드리게되어 죄송합니다.
잘 정리해서 필요한 분들을 위해 올려놓겠습니다.
다시한번 감사의 말씀드립니다.
ps) 구현된 예제와 설명을 간략하게 정리해 놓았습니다.
http://gnusr.com/g4/preload/sock_preload_out.php