common.php 를 졸라 쉽게 인클루드 하기 > 그누보드5 팁자료실

그누보드5 팁자료실

common.php 를 졸라 쉽게 인클루드 하기 정보

common.php 를 졸라 쉽게 인클루드 하기

본문

 

1. 우리가 그누에 새로운 페이지를 만들거나 등등 그누의 기본 환경을 사용하려면

반드시 그누루트에 있는 common.php 를 "상대경로"로 인클루드 해야 합니다.

 

2. 그런데 이럴 때마다 ../ 를 몇개 붙여야 할지 헷갈리고 더구나 모바일 스킨과 pc 스킨은 이게 한끗발이 차이가 나며 테마를 사용할 때라거나 여러가지 성가시고 귀찮은 점이 많아서 코드를 한번 만들어 보았습니다.

 

3, 코드를 보면 아시겠지만 현재의 위치에서 "adm", "bbs", "extend" 디렉토리가 존재한다면

그 위치의 common.php 를 인클루드하고

아니라면 한단계 위의 부모 디렉토리로 치고 올라가서 같은 작업을 수행하고...

계속 동일한 형태로 진행하다 결국 조건에 맞는 상황이 되면 드디어 common.php 를 인클루드하는 while 문으로 구성했습니다.

 

4. 만일 "adm", "bbs", "extend" 외에 더 엄밀성을 주고 싶다면 원하는 디렉토리를 본인의 의도만큼 배열 안으로 계속 넣어주면 되겠습니다.^^

 


<?php
function is_common($inc) {
    $root_dir = ["adm", "bbs", "extend"];
    $dir_count = 0;
    foreach ($root_dir as $g5_dir) if (is_dir($inc.$g5_dir)) $dir_count += 1;
    return $dir_count == count($root_dir);
}
if (is_common("./")) $common_include = "./common.php";
else {
    $parent_dir = "../";
    while (!is_common($parent_dir)) $parent_dir .= "../";
    $common_include = $parent_dir."common.php";
}
include_once($common_include);
?>
추천
16

댓글 30개

와~ 이런식으로 하면 되는군요. 1층에서 옆으로 봐 찾는게 없어? 그런 2층으로 찾아봐...없어? 그럼 3층...또 없어? 그럼 4층...언젠간 만난다.... ^^
정말 프로그램이란것은...정답이 없다는게 또한번 실감나게 해주시네요.

저 같은 비개발자에겐 정말 고마운 소스 입니다. 이걸 응용하면 다른 것도 가능 하겠네요. ^^

더운데....고생하셨습니다. ^^

아 이번에 여분필드를 뷰페이지나 리스트페이지(사실 리스트페이지는 큰 상관 없음)에서 아작스로 바꾸는 스킨이 좀 필요해서요.
아작스로 안 바꾸면 새로고침이 되어서 유튜브가 끊기거든요.
액션문서가 필요한데 어쨌거나 common.php 를 꼭 포함시켜야 하니까 상대경로를 빼보다 보니 테마스킨이랑 기본스킨의 상대경로가 달라지기에 내 손발 좀 편하자고 한번 만들어 봤어요.
난 맨날 헷갈림 지금도 헷갈림 그래서아예복사해서 내위치에두고 그놈이 ../ 또는../../ 으로 처리했는뎅;;; 좋아부러써요 ㅎ
그렇지만 common.php 파일이 상위 디렉토리에서 멀리 떨어져 있는 경우,
여러 단계의 상위 디렉토리를 확인해야 하므로 파일 시스템 접근이 많아질 수 있죠.
이는 파일 접근 비용이 높은 경우, 파일 시스템에 부하를 줄 수 있고, 웹 서버의 응답 속도가 느려지는 원인이 되기도 합니다.

또한 이런 탐색 과정은 보안 측면에서도 문제가 될 수 있습니다.
만약 웹 서버의 루트 디렉토리 이외의 디렉토리에 common.php 파일이 존재하거나,
커몬 파일이 아닌 다른 파일이 커먼파일로 포함되는 상황이 발생하면 보안상의 문제가 발생할수도 있습니다.

이러한 이유로 상위 디렉토리를 계속 탐색하는 방식은 성능과 보안 측면에서 좋지 않을 수있다는 이야기죠.

그래서 왠만하면 common.php 파일의 경로를 정적으로 설정하거나, 상대적인 경로가 아닌 절대적인 경로를 사용하여 include_once 문을 사용하는 것이 좋을듯합니다.

결론은 너무 멀리 있는 곳은 사용을 자제 했으면 한다고 생각합니다.
내 개인적인 생각이니 참고하시고 사용 하시면 될 것 같습니다. 아무튼 멎집니다.^
어이쿠 감사합니다.
원하는 분은 사용하실 거고 아니면 아닌 거고 그런 거지요.
그런데 이 정도를 훓는데(기껏해야 일반적으로 심도가 깊어봐야 대여섯 단계에 파일이 아니라 디렉토리만 점검하는 수준) 부하가 먹을 거란 생각은 제 경험상 거의 걱정할 수준이 아니라 생각합니다.
우연찮게 다른 디렉토리에 동일한 환경이 생길 확률은 아주 희박하겠지만 그래도 조심할 부분이 있다는 것에는 동의합니다. 이걸 사용할 거라면 애초에 그런 환경 자체를 만들지 말아야 하겠죠.
폴더명은 혹시나 변경해서 사용할 수 있으니 주요 파일을 찾는 버전으로 만들어봤습니다.


function findG5Common(string $path = __DIR__)
{
    $files = ['common.php', 'config.php', 'version.php', 'head.sub.php', 'tail.sub.php'];

    do {
        if (!$path) {
            return null;
        }

        if (
            count($files) === count(array_filter($files, function ($file) use ($path) {
                return file_exists($path . '/' . $file);
            }))
        ) {
            return $path . '/common.php';
        }
    } while ($path = (($path !== $_SERVER['DOCUMENT_ROOT']) ? dirname($path) : null));

    return null;
}

$filepath = findG5Common(__DIR__);
if ($filepath) {
    include_once($filepath);
} else {
    echo '없는뎅? 여기가 그누보드 폴더 마장?';
}


사실 `/data/dbconfig.php`파일 하나만 찾아도 되지만 `data` 폴더의 이름을 바꿨을 수도 있고,
`$_SERVER['DOCUMENT_ROOT']`부터 `__DIR__`까지 하나씩 내려 오는 게 가장 빠르겠지만, 그누보드 안에 또 그누보드가 설치되어 있을 수도 있으니 거꾸로 올라가게 하는게 낫겠더군요.

어디까지나 재미!!!?로 해본거예요. 실용적이진 않죠. '../../../' 찍는게 훨씬 낫겠습니다.
이게 여러군데서 사용되면 함수가 재정의 되는 문제로 오류가 나겠죠!
?
맞아요. 그냥 재미란 측면이 더 강하고 직선적으로 ../를 연속으로 찍는 것이 훨씬 효율적이죠.
위에서 밑으로 훓으면서 내려오는 경우도 예전에 파일트리 만들때 이외에는 코드를 짜본적이 없습니다.
사실 파일트리도 관상용 재미죠. 만들어 놓고 거의 쓴적 없고 ftp 에서 다 하니까요.
그런걸 생각하면 실무용이 아닌 재미용 코드는 쓸일도 별루 없는데 때가 되면 하나씩 만들어 지더라구요.
위에서 내려오는 것도 __DIR__에서 하나씩 떼서 내려오면 되니까 파일 트리를 만들 필요는 없죠.
$path = doc root;
$폴더들 = explode('/', __DIR__);

반복{
$path .= '/'.array_shift($폴더들);
if 파일확인
}

폰에서 타이핑하기 힘들어서 대충...
전문가들 토론이 끝나셨나요? 최종버전 어떻게 되나요?

비 개발자이면서 설치 구조를 변경 안한다는 전제조건이라면 어떤 코드를 사용하면 좋을까요?


include_once($_SERVER['DOCUMENT_ROOT'] . '/common.php');

// 하위 폴더에 설치했으면...
include_once($_SERVER['DOCUMENT_ROOT'] . '/하위폴더명/common.php');


사실 이거면 되는데, 그누보드 자체나 플러그인 등에서는 호환성을 위해서 ../../../ 이렇게 굳이 찾아가는 거라서 배포할게 아니라면 위와 같이만 해도 됩니다.

원하는 걸 쓰심 되구요.
그래도 그냥 제것 쓰세요.ㅋ
제 코드가 그래도 ../ 로 구성된 소스니까요.
여차하면 함수없이 소스를 바꾸어서 사용해도 되구요.
그리고 사실 bbs, shop 등 일부 폴더 밑에서는 _common.php 파일에 일부 로직이 있고 이걸 include해야해서 /common.php 파일을 직접 include 하면 안되는 경우도 있죠.
결국은 _common.php를 찾던 루트의 common.php를 찾아서 ../로 타고 올라가는게 맞긴합니다.
?
코딩하는 사람들은 거의 쓸일도 없고 원래 쓰는 방식보다 효과도 별로지만 그냥 맘이 땡겨서 만들어보는 경우가 많은 것 같아요.
이것도 ../ 를 사용하는게 제일 무난하지만 결국 이것저것 시도해 보는 일종의 호기심과 재미가 시간투자를 하게 만드니까요.
비타주리님 팁에서 힌트를 얻어 재미로 한번 만들어 보았습니다.
사용할 일이 없을 것 같긴 하지만, 가끔 ../../../ 갯수가 헷갈릴때가 있는데, 그때는 편해지겠지 싶네요.
$pos = __FILE__;
$path = array_filter(explode("/",$pos));
foreach($path as $val) {
    $cut = array_pop($path);
    $common_path = '/'.implode('/',$path).'/common.php';
    if(file_exists($common_path)) { //common
        include_once($common_path);
        break;
    }
}
뭐 방법이야 가지가지고 여튼 본인이 편한 재미용 소스는 하나씩 만들어 쓰면 되지요.
common 파일을 찾는 상황이야 어차피 배열과 루프문을 조합해서 빼는 거니까 본인이 제일 편한 방식으로요.
별것 아닌 팁에 메이드님까지 참여시켰으니 성공입니다.ㅋ
감사합니다.
정말 필요한 자료네요~~^^
빌더나 테마 적용 후 소스 수정하거나 첨부할 때 정말 애먹었는데, 한방에 해결되네요~~^^
전체 126 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT