2012-01-16 4 views
1

잠시 동안 웹 사이트가 생겨서 수년 동안 수백 개의 개별 PHP 파일로 성장했습니다. 약 2 년 전 나는 같은 웹 사이트의 모바일 버전을 만들었습니다. 필자는 주 파일 만 복사하고 모바일 용 헤더 및 바닥 글을 조정하여이 작업을 수행하기로 결정했습니다. 나머지는 예상대로 작동했습니다. 이 시점에서 50 %의 호환성을 말하고 싶습니다. 하위 디렉토리 중 일부를 복사하는 대신 ln -s을 사용하여 링크를 만들 수 있다고 결정했습니다. 이것은 나머지 45 %를 해결했습니다.PHP - 다른 파일을로드하는 경우

최근 문제가 발생했습니다. 이 sym 링크 된 하위 디렉토리의 파일 중 하나는 모바일 버전과 전체 웹 사이트에서 크게 달라야합니다. 보통 파일의 경우 하드 카피를 만들고 내용을 수정하지만 sym 링크 된 디렉토리 내의 파일에 대해서는 불가능합니다.

누구에게이 문제가 있습니까? 이 문제를 어떻게 해결할 수 있습니까? 내가 파일 /tools/help/wizard/configure.php을 수정해야하는 경우

/var/www/domain.com/ 
/var/www/mobile.domain.com/ 

/var/www/mobile.domain.com/images -> /var/www/domain.com/images 
/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools 

그때 난 그냥 그 파일

에 대한 고유 한 파일이 없습니다 : 여기

는 파일 레이아웃을 & 예입니다 이는 UGL 것 같아

if (file_exists("/var/www/mobile.domain.com/_overwrite_/" . $requested_file)) { 
    // ... include it instead of running the actual file 
} 

: 나는 생각하지만, 뭔가를 확인하기 위해 모바일 header 파일을 수정한다 좋아하지 않는다

한 가지 방법 접근 방식. 아파치 지시어로 비슷하게 할 수있다. (나는 모른다.하지만 ModRewrite라고 생각한다.)

+0

더 나은 접근 방법이 없다고 생각합니다. Mod-rewrite는 PHP가 아닌 사용자 (브라우저)가 보낸 HTTP 요청을 리디렉션/수정하는 데 사용됩니다. 아파치는 사용자와 PHP 사이의 "다리"입니다. – Kristian

+0

여기에서 전환하는 것이 무엇인지 물어볼 수 있습니까, 아니면 페이지의 프리젠 테이션 논리입니까? 모바일 플랫폼을위한 다른 프리젠 테이션을 지원하는 비즈니스 논리가 변경 되었습니까? – Scuzzy

+1

오토로더 또는 간단한 include 문을 사용합니까? –

답변

1

파일 시스템 레벨 문제로 제기되고있다. 파일 시스템 레벨에서 그것을 해결하기 위해, 당신은 단지 덮어 쓰고 싶은 엔트리를 제외한 디렉토리 내의 모든 엔트리에 심볼릭 링크를 만들 수 있습니다.

당신은 mobile.domain.com을위한 특별한 /tools/help/wizard/configure.php 다음, 대신 당신은 help 제외 도구의 모든 항목에 대한 소프트 링크를 만들 수 있었다

/var/www/mobile.domain.com/tools -> /var/www/domain.com/tools 

디렉토리 수준의 소프트 링크하려면 다음

/var/www/mobile.domain.com/tools/file1 -> /var/www/domain.com/tools/file1 
/var/www/mobile.domain.com/tools/file2 -> /var/www/domain.com/tools/file2 
/var/www/mobile.domain.com/tools/file3 -> /var/www/domain.com/tools/file3 

을 실제 디렉토리 tools/help을 만들고 wizard을 제외한 모든 항목에 대한 소프트 링크를 만듭니다. 그리고 실제 디렉터리 wizard 확인하고 configure.php를 제외하고 거기에 모든 항목에 소프트 링크합니다

/var/www/mobile.domain.com/tools/help/fileH1 -> /var/www/domain.com/tools/help/fileH1 
/var/www/mobile.domain.com/tools/help/fileH2 -> /var/www/domain.com/tools/help/fileH2 
/var/www/mobile.domain.com/tools/help/fileH3 -> /var/www/domain.com/tools/help/fileH3 
/var/www/mobile.domain.com/tools/help/wizard/fileW1 -> /var/www/domain.com/tools/help/wizard/fileW1 
/var/www/mobile.domain.com/tools/help/wizard/fileW2 -> /var/www/domain.com/tools/help/wizard/fileW2 
/var/www/mobile.domain.com/tools/help/wizard/fileW3 -> /var/www/domain.com/tools/help/wizard/fileW3 
/var/www/mobile.domain.com/tools/help/wizard/configure.php` 

이제, 그들이 존재하는 사용자 정의 된 실제 파일을 선택합니다 mobile.domain.com에 포함하고 소프트 링크가 데리러를 통해 맞춤 설정이없는 기본 사이트의 파일

단순한 쉘 스크립트를 작성하여 소스 디렉토리의 내용을 나열하고 각각의 대상 디렉토리에 소프트 링크를 작성하는 것만으로 모든 소프트 링크로 디렉토리를 작성하는 것이 지루하지 않을 것입니다.

/var/www.domain.com에 파일을 추가 할 때마다 /var/www/mobile.domain.com의 소프트 링크를 업데이트하는 것이 지루할 것입니다. 이것은 단일 사이트에 대한 원래 코드를 설계 한 다음 나중에 여러 사이트로 확장하려고 시도한 결과입니다.코드를 재구성하면 파일 추가 및 제거를 처리하는 방법이 향상 될 수 있지만 이는 많은 노력이 필요합니다. 나는 당신의 질문에서 당신이 당신의 코드를 재구성하는 것을 피하려고한다.

PHP 개체 계층 구조 수준에서이 문제를 처리 할 수있는 방법이 있음에 유의하십시오. domain.com에 대한 PHP 파일에서 객체와 클래스를 정의한 경우 mobile.domain.com에 대한 PHP 파일에 domain.com의 하위 클래스를 정의하고 필요한 수정 만 할 수 있습니다. 그런 식으로 mobile.domain.com은 다른 모듈을 정의하는 PHP 파일 만 포함하면됩니다.

+0

+1로 끝납니다. 내가 가장 좋아하는 솔루션은 아니지만 적어도 아직 고려하지 않은 솔루션입니다. – Mikhail

0

모바일 헤더에 상수를 설정하십시오 : 시작에 불과에서 간단한 검사와는 appropiate 다른 파일을로드 할 당신이이 모바일 버전에 따라 다를 수하는로드 파일에 다음

define(IS_MOBILE_VIEW, true); 

:

if(defined(IS_MOBILE_VIEW) && IS_MOBILE_VIEW) { 
    require_once '/var/www/mobile.domain.com/other_file.php'; 
} else { 
    //rest of file, you can also use a return; in the if clause 
    //or something similar if you don't want to enclose the whole logic in 
    //an else clause 
} 
0

나는 당신이 묘사 한 것보다 낫지 않습니다. 사실 모든 include 문이 한 곳 (header.php?)에 있으면 괜찮은 솔루션처럼 보일 것입니다.이 논리를 나머지 앱에서 숨길 수 있기 때문입니다. 나는 그것에 단점이없는 것을 본다.

이것을 더 많이 사용하려면이 코드를 함수로 추상화하고 포함 호출을 코드로 바꿀 수 있습니다. 나중에 코드를 터치하지 않고도 원하는 파일을 덮어 쓸 수 있습니다.

미래에 PHP의 autoload 기능을 살펴볼 수도 있습니다.

+0

당신의 대답은 혼란 스럽습니다. 추상 * 함수로 들어가는 것은 무엇입니까? 또한 수업에 관해 누가 말 했나요? header.php는 사용자가 로그인했는지 확인하고 HTML의 시작 부분을 표시합니다. 그게 다야 – Mikhail

관련 문제