그누보드는 상대경로를 어떻게 알아낼까요?
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를 찾는것 같이 보입니다.
그러므로 오류가 발생할 수도 발생하지 않을 수도 있다는것이지요.
이렇듯이 경로문제는 다시 한번 확실히 짚고 넘어가야 될것 같습니다.
좋은 의견 좀 부탁드립니다.
@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를 찾는것 같이 보입니다.
그러므로 오류가 발생할 수도 발생하지 않을 수도 있다는것이지요.
이렇듯이 경로문제는 다시 한번 확실히 짚고 넘어가야 될것 같습니다.
좋은 의견 좀 부탁드립니다.
|
댓글을 작성하시려면 로그인이 필요합니다.
로그인
댓글 14개
값이 없으면 현재 폴더를 의미, "../" 라면 하위 폴더를 의미와 같은 식으로요.
경로변수를 위해 따로 생성되는 파일은 없는것 같습니다.
프로그램 설치시 사용자가 적어주었던가. 아니면 자동으로 찾았던가는 기억이 잘 안나구요...
그누에서도 제로보드의 방식을 따라도 되고.
아니면 설치자가 수동으로수정해줘도 되고...
그누보드도 제로보드와 경로상의 문제는 비슷할것 같은데....
7 - 4는 3 ../../../ + gnu변수 붙이면 되죠!....
소스는 아까 올려주시는 코드로 충분합니다.
시시시님의 방법도 고려해 보기로 하겠습니다.
감사합니다.
/갯수를 파악해서 깊이를 알아내는 겁니다. 현재 갯수 - 기본갯수
저상태라면 현재갯수 - 기본갯수 하면 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 폴더에 담아두고 있어 절대경로, 주소 부분의 효용성이 별로 커 보이진 않습니다.
그누보드도 제로보드처럼 모든 파일을 같은 폴더안에 위치시킨다면 경로부분의 오류는 최소화 할 수 있으리라 봅니다.
현 상황에서는 이러지도 저러지도 못하고 있지만요... ㅡㅡ;
예)$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 개월전?) 에 제가 올렸던 팁도 있었었는데....
두서없이 말씀드려 무슨 말인지 햇갈릴것도 같네요... ^^
윈도우환경에서 특별한 문제 없이 잘돌아가고 있습니다...예전버전 2_3버젼 때만 해도 에러가 주룩주룩 있었습니다만
이젠 안정화가 거의 된듯합니다. 일부 악세사리 부분역시 에러없이 잘되구요...
언제 한번 바이블형식으로 각 .php 파일들에 대한 분석이 필요하다고 보여집니다... 지금 당장 그누보드로 현장에
투입해도 무리가 없을것 같군요.....^^