그누보드는 상대경로를 어떻게 알아낼까요? > 그누3질답

그누3질답

그누보드는 상대경로를 어떻게 알아낼까요? 정보

그누보드 그누보드는 상대경로를 어떻게 알아낼까요?

본문

lib.inc.php를 보면

@include_once "config.inc.php";
@include_once "dbconfig.inc.php"; <- @ 를 붙이면 오류가 있어도 오류 표시를 화면에 나타내지 않습니다.

if ($cfg[mysql_host] && $cfg[mysql_user] && $cfg[mysql_db]) { // dbconfig.inc.php를 읽었는지를 알아냅니다.
    // 상대경로가 선언되지 않았다면
    if (!isset($reldir)) {
        $reldir = ".";
        if (!file_exists($cfg[dir_session])) {
            $reldir = "..";
        }
    }

    ... 생략 ...

} else { // dbconfig.inc.php가 없다면 설치합니다.
    echo "<span style='font-size:9pt;'>";
    echo "<p>DB의 설정이 올바르지 않거나 dbconfig.inc.php가 존재하지 않습니다.";
    echo "<p>설치방법 : http://도메인/그누보드디렉토리/_admin/install.php";
    echo "<p>[<a href='$cfg[dir_admin]/install.php'>지금 설치</a>]";
    echo "</font>";
    exit;
}


위에 주석을 붙인것 처럼 dbconfig.inc.php가 있는지를 확인하고 없다면 설치를 합니다.

있다면 $reldir이 선언되었는지를 확인한 후 선언되지 않았다면 . 현재 폴더로 설정하고 data/session 폴더가 존재하지 않는다면 .. 을 상대경로로 설정합니다.

예를 들어서...

gnu 폴더 밑에 bbs 폴더가 있다고 가정합니다.

gnu 폴더의 index.php를 실행시키면 $reldir은 . 이 될것입니다.
우선 $reldir이 선언되지 않았으므로 . 으로 설정되고 , gnu/data/session 이 존재하므로 그냥 건너뜁니다. 그러므로 결과는 .

gnu/bbs 폴더의 gnuboard를 실행시키면 $reldir은 .. 이 될것입니다.
우선 $reldir이 선언되지 않았으므로 . 으로 설정되고 , gnu/bbs/data/session 이 존재하지 않으므로 .. 을 설정합니다. 그러므로 결과는 ..

위와 같이 상대경로를 설정하여 처리를 하고 있는데요.

php가 실행되는 os마다 차이가 있는것 같습니다.

gnu/bbs/gnuboard.php를 실행하면

include_once "../lib.inc.php";

그러니까 현재 폴더의 상위 폴더에 존재하는 lib.inc.php를  include하게 됩니다.

lib.inc.php의

@include_once "config.inc.php";

위의 코드가 gnu/config.inc.php를 include할까요? 아니면 gnu/bbs/config.inc.php를 include할까요?

정답은 둘다 include 할 수도 있고 gnu/bbs/config.inc.php 만 include 할 수도 있다 입니다.

os, php 버전의 상황에 따라 gnu/bbs/config.inc.php를 찾아보아서 없으면 gnu/config.inc.php를 찾는것 같이 보입니다.

그러므로 오류가 발생할 수도 발생하지 않을 수도 있다는것이지요.

이렇듯이 경로문제는 다시 한번 확실히 짚고 넘어가야 될것 같습니다.

좋은 의견 좀 부탁드립니다.
  • 복사

댓글 전체

제로보드는 $_zb_path 변수에 그때 그때 상황에 따라 값을 설정하고 있네요.

값이 없으면 현재 폴더를 의미, "../" 라면 하위 폴더를 의미와 같은 식으로요.

경로변수를 위해 따로 생성되는 파일은 없는것 같습니다.
제기억에는 제로보드는 설치할때 절대경로를 설정하는 파일을 생성하더라구요....
프로그램 설치시 사용자가 적어주었던가. 아니면 자동으로 찾았던가는 기억이 잘 안나구요...
그누에서도 제로보드의 방식을 따라도 되고.
아니면 설치자가 수동으로수정해줘도 되고...
그누보드도 제로보드와 경로상의 문제는 비슷할것 같은데....
그리고 깊이를 알아내는건 /home/ccc/www/kkk/ 여기서
/갯수를 파악해서 깊이를 알아내는 겁니다.  현재 갯수 - 기본갯수
저상태라면 현재갯수 - 기본갯수 하면 5 - 4 년 1개가 되겠죠... 그럼
../ 한번만 반복해주고 뒤에 gnu만 붙이면 상대주소가 됩니다.
전혀 그럴것 같지 않는데요.... 그래서 폴더명을 변수로 사용한겁니다. *^^*
소스 보내드릴가요 보시고 판단해보시는게 나을듯 싶네요...*^^*
폴더명을 변경하여 사용할 경우에는 프로그램의 수정이 반드시 있어야 된다는 단점이 있습니다.
파일명을 변경할 경우에는 많은 수정이 가해져야겠네요.
전체적인 구도로 말씀드려보겠습니다.
/home/ccc/www/gnu/index.html      상대주소는 . 
/home/ccc/www/index.html            상대주소는 ./gnu
/home/ccc/www/kkk/index.html      상대주소는 ../gnu
/home/ccc/www/kkk/mmm/index.html  상대주소는 ../../gnu
/home/ccc/www/kkk/ggg/yyy/index.html  상대주소는 ../../../gnu
이렇게 됩니다.
그렇타면 /home/ccc/www/kkk/ggg/index.html에서 그누보드 lib.inc.php를 불러오게되면
현재는 .와 ..것만 존재합니다. 당연히 에러가 뜨죠...
그렇타면 /home/ccc/www/kkk/ggg/index.html폴더에대한 /home부터의 깊이를 알아내고...
/home/ccc/www/부터 kkk/ggg/index.html까지의 상대주소만 알아내서
그걸 ../..로 치환해주고나서 ../../gnu 이렇게 되면 상대주소가 되겠죠..
위치와 상관없이
그작업을 lib.inc.php안에서 실행해주고 나면 위치와 상관없고 절대URL, 절대주소가 필요없게 될것같은데..쩝
또한 만약에 보드가 실행중이라면 보드자체가 메인이기때문에 보드폴더를 자신으로 계산하고
../_admin 식으로 사용하고 자기 자신폴더안인경우는 ./이렇게 하면 다 해결될것 같은데...
쩝 머가 문제되는지요?
모르겠습니다. winNT계열에서는 어떨지 모르나...확실히 리늑수 계열에서는
http://61.40.183.198/~cccwork/
http://ccc.na.ly 기타 방식도 이상없이 작동합니다.
모르겠습니다.....요즘 영 아니네요... 스트레스를 마니 받아서 그러나..쩝....
조금 흥분된상태에서 쩝 이것저것 머리가 복잡하네요..*^^*
이글과는 상관이 별로 없어보이지만 제로보드는 절대경로와 절대주소를 사용할 수 있는 변수를 가지고 있는것 같습니다.
다만 제로보드는 모든 파일을 bbs 폴더에 담아두고 있어 절대경로, 주소 부분의 효용성이 별로 커 보이진 않습니다.
그누보드도 제로보드처럼 모든 파일을 같은 폴더안에 위치시킨다면 경로부분의 오류는 최소화 할 수 있으리라 봅니다.
현 상황에서는 이러지도 저러지도 못하고 있지만요... ㅡㅡ;
그리고 $reldir 이라든가 하는 전역변수들은 $cfg에 통합하는 방법이 어떨까 말씁드려 봅니다만....
예)$cfg[home_url],$cfg[root] ...... 이런식으로
왜냐하면 함수에서 사용시 전역변수를 global $reldir ,$cfg.... 이런식으로 여러개 나열하기는 귀찮을것 같더라구요.
또 그중하나를 빼먹을 수도 있고...
어떤함수에서도 global $cfg 이녀석 하나만 있으면 사용하능하게....
이상 제 생각이었습니다...
관리자님 좋은보드만드시느라 수고가 많습니다.
음... 제생각과 경험은  os가 자기 마음대로 바로상위경로에서 인클루드할 파일을 찾다가 없으면 그상위를 찾지 못하는 걸로 알고 있습니다만...
인클루드를 할때는 언제나 현재 호출된 파일의 경로입장에서 인클루드 파일을 찾는다는 것입니다.
예를 들어서
./gnu/bbs/lib.inc.php 여기에 @include_once "config.inc.php"; 가 이렇게 인클루드 되어 있죠?
그럼 호출하는 파일 즉 ./gnu/bbs/gnuboard.php 에서 호출을 할때는
 현재 gnuboard.php 자신의 입장에서 같은 경로의 config.inc.php를 찾습니다.
하지만 ./gnu/index.php에서 lib.inc.php를 인클루드하면 음.. 인클루드를 하라고 음 보니 내경로에 config.inc.php를 인클루드하라는 소리군하면서 ./gnu/에서 config.inc.php를 찾아서 없으니 에라를 발생시킵니다.
또 확장을 해서 ./gnu 폴더와 같은 깊이의 옆의 디렉토리의 파일 ./mydir/index.php 이라는 에서 lib.inc.php를 인클루드하면  이놈은 lib.inc.php를 읽어보고 음  내경로에 config.inc.php를 인클루드하라는군 하면서 자신의 경로에서 config.inc.php를 인클루드하게 되죠.
또 include "config.inc.php" 가 include ./XX/XX/config.inc.php라고 했다고해도
디렉토리의 깊이가(현재의 gnuboard.php 보다 상위디렉토리거나 하위디렉토리에서 호출할때) 틀려지면 config.inc의 파일을 lib.inc.php의 안에 포함된 인클루드는 언제나 위치가 호출하는 파일에 의해서 ./gnu/bbs에 있기도 하고 어떨때는 ./gnu에 있기도해서 오류가 생기지요.
 이것을 해결하기위해서는
$reldir/lib.inc.php에서의 $reldir과 $reldir/config.inc.php의 $reldir이 언제나 같게 해야 하므로 lib.inc.php를 인클루드 할때는 언제나 반드시 $reldir이 먼저 정의 되어야 합니다.
 $reldir="xxx/xxx/xx";
 include "$reldir/lib.inc.php";(물론 이 안의 config.inc.php는 $reldir/config.inc.php 이런식으로 인클루드가 되어야 하겠지요?)
반드시 $reldir이 먼저선언되어야 합니다. 꼭 lib.inc.php내에서 정의 하려고 하면야 lib.inc.php에서 호출하는 파일에 따라서 자신의 위치를 찾아야겠지요 간단히 dirname(__FILE__)."/config.inc.php 이런식으로 찾던가 아니면 PHP_SELF 값에서 경로를 찾아내어 수정해주는 방식 이런것이 되겠지요.

아니면 유동적인 절대경로찾는법(?) HTTP_HOST DOCUMENT_ROOT 등의 서버에 따라서 이미설정이 되어있는값들을 이용해서 PHP가 실행되는곳이면 어디에서든지 자동으로 찾아서 사용자는 수정할필요도 없게 하는것이지요.
얼마전(1, 2 개월전?) 에 제가 올렸던 팁도 있었었는데....

두서없이 말씀드려 무슨 말인지 햇갈릴것도 같네요... ^^
현재 윈도우 2000 프로에서 그누 테스트를 계속하고 있습니다...
윈도우환경에서 특별한 문제 없이 잘돌아가고 있습니다...예전버전 2_3버젼 때만 해도 에러가 주룩주룩 있었습니다만
이젠 안정화가 거의 된듯합니다. 일부 악세사리 부분역시 에러없이 잘되구요...
언제 한번 바이블형식으로 각 .php 파일들에 대한 분석이 필요하다고 보여집니다... 지금 당장 그누보드로 현장에
투입해도 무리가 없을것 같군요.....^^
© SIRSOFT
현재 페이지 제일 처음으로