phpSyntaxCheck |
본 라이브러리는 PHP(ver7+) 로 제작되었으며 쉘 명령어인 php -l 을 이용하여 PHP 문법에 어긋난 파일을 사전에 찾아 점검할 수 있는데 목적을 두고 있습니다.
쉘(Shell) 명령어를 사용하는 만큼 반드시 php 실행권한이 있어야 하며 해당 권한이 없는 경우 이용이 불가능한점 미리 참고 바라며 본 라이브러리는 복잡한 프로그램을 통해 구성된 라이브러리가 아니기에 모든 환경에서 지원된다는 보장을 100% 할 수 없는점 미리 알려드립니다.
phpSyntaxCheck 가 필요한 이유
PHP로 개발된 프로그램들은 많은 테스트와 디버깅을 통해 최종 배포가 됩니다. 요즘같이 에디터에서 실시간으로 문법 체크를 해주는 기능들덕에 문법 오류 발생률은 많이 줄어들고 있습니다. 다만 많은 파일들을 일괄 수정할 경우에는 수 많은 파일들을 실행 또는 열어서 문법 체크를 하기란 어렵습니다. 또한 원격 상의 파일들은 문법 체크를 하기위해선 서버 접속 후 모두 열어서 체크하거나 쉘 스크립트를 별도로 작성하여 문법 체크가 필요합니다.
이러한 이유로 바쁜 개발자들에게 조금이나마 시간을 절약하기 위해선 웹상에서 실행하고 에디터에서 바로 수정할 수 있는 phpSyntaxCheck를 만들어서 배포하게 되었습니다.
저작권
해당 프로그램의 라이선스는 REDINFO 그룹 에 있으나 파일의 소스코드 상단에 제작자 정보가 포함된 주석을 삭제 하지 않는 조건으로 수정 및 재배포가 가능합니다.
개발자가 만든 소스코드의 경우 실제로 제작자 표기가 없을 경우 수고를 들여 만든 개발자의 자료가 무의미해지기 마련입니다. 이처럼 개발 소스는 퍼가고 사용하면 그만이겠지만 많은 시간을 투자하여 만든 개발자를 배려한다면 제작자 정보가 포함된 주석은 남겨두었으면 하는 바램입니다.
사용예제
가장 먼저 하단의 phpSyntaxCheck 라이브러리를 다운로드하여 압축해제 후 웹상 실행가능한 디렉토리에 업로드 합니다.
라이브러리 다운로드 (예제소스 포함)
기본적인 사용 방법
<?php
include_once __DIR__."/class-phpSyntaxCheck.php";
$psc = new phpSyntaxCheck();
$response = $psc->apply(); // 실행
/*
$response['dirList'] => 디렉토리 목록
$response['fileList'] => 파일목록
$response['syntax']=> 검사결과
$response['file'] => 검사 파일목록
$response['errmsg'] => 에러결과 메시지
$response['errfile'] => 에러파일
$response['fmsg'] => 체크실패 메세지
*/
if( $response === false ){
echo '검사 가능 파일없음';
}
else{
echo '에러 '.number_format(count($response['syntax']['errmsg'])).'개';
$errmsg = implode("\n",$response['syntax']['errmsg']);
$psc->pr($errmsg);
}
|결과
에러 1개
PHP Fatal error: Cannot redeclare exec() in /home/dev/phpSyntaxCheck/ex-errorfile.php on line 2
검사 파일이 많을 경우 아래와 같이 비동기 통신 후 결과값을 파일로그에서 직접 확인이 가능합니다. 단 log 디렉토리의 권한은 757 이상이여야 합니다.
<?php # 테스트 파일: 일반실행+비동기
include_once __DIR__."/class-phpSyntaxCheck.php";
$psc = new phpSyntaxCheck();
// 해당 파라미터($_GET['accessAsync'])가 없을 경우 $this->filechk() 메소드에서 본 파일을 실행하여 무한 loop에 빠질 수 있다.
// ex) https://dev.redinfo.co.kr/syntaxcheck.php?accessAsync=true 로 실행
if( !empty($_GET['accessAsync']) && $_GET['accessAsync'] == 'true'){
$url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?async='.time();
$psc->async($url);
echo '비동기 통신 전송완료';
}
else{
if( !empty($_GET['async'])){ $psc->errlog('async: '.$_SERVER['REQUEST_URI']."\n\n"); }
$response = $psc->apply(); // 실행
/*
$response['dirList'] => 디렉토리 목록
$response['fileList'] => 파일목록
$response['syntax']=> 검사결과
$response['file'] => 검사 파일목록
$response['errmsg'] => 에러결과 메시지
$response['errfile'] => 에러파일
$response['fmsg'] => 체크실패 메세지
*/
$errlog = '';
if( $response === false ){ $errlog .="검사가능한 파일이 없습니다.\n"; }
else{
if( !empty($response['syntax']['file']) && count($response['syntax']['file']) > 0){
$errlog .= "[검사파일(".number_format(count($response['syntax']['file']))."개)]\n";
$errlog .= implode("\n",$response['syntax']['file'])."\n\n";
}
$errlog .= "[에러파일(".number_format(count($response['syntax']['errmsg']))."개)]\n";
if( !empty($response['syntax']['errmsg']) && count($response['syntax']['errmsg']) > 0){
$errlog .= implode("\n",$response['syntax']['errmsg']);
}
}
$viewlog = date('[Y-m-s H:i:s]')."\n".$errlog."\n\n";
$errlog = date('[Y-m-s H:i:s]')."\n".strip_tags($errlog)."\n\n";;
$psc->errlog($errlog);
$psc->pr($viewlog);
}
| 결과
비동기 통신 전송완료
기본적으로 파일검사 시 루트 디렉토리 설정이 필요하며 미 설정시 phpSyntaxCheck 프로그램이 설치된 디렉토리를 기반으로 체크를 하게 됩니다. 만약 별도의 루트 설정을 하실 경우 아래와 같이 설정해주세요. (※모든 설정은 반드시 apply 메서드 전에 실행해야합니다.)
$psc->set('rootDir','디렉토리 절대경로'); // ex) $psc->set('rootDir',$_SERVER['DOCUMENT_ROOT']);
참고로 위의 예제에서 사용된 로그를 남길 시 디렉토리 경로는 아래와 같은 메서드를 통해 설정이 가능합니다. (현재 기준 상대경로 또는 절대경로)
$psc->set('errlogDir','디렉토리 절대경로'); // ex) $psc->set('errlogDir',$_SERVER['DOCUMENT_ROOT'].'/log');
파일명의 경우 기본 `date{Ymd}-error.log` 포맷으로 생성이되나 별도의 파일명을 원하실 경우 아래와 같이 errlog 메서드 사용시 2번째 파라미터(파일명)에 원하는 파일명을 지정해 줄 수 있습니다.
$psc->errlog('내용','파일명'); // ex) $psc->errlog('로그내용','error-result.log');
PHP 의 문법 체크는 소스에 대한 치명적인 문법만 검사하기때문에 Notice 나 웹 실행시 발생되는 Warning 같은 에러는 기본 기능으로는 확인할 수 없습니다. 이때 시도해 볼 수 있는 방법은 PHP 스크립트를 직접 실행할 수 있는 옵션 입니다. 해당 옵션은 아래와 같습니다.
$psc->set('filechk',true);
위의 옵션을 실행하면 `php -f 파일명` 으로 쉘 명령어를 실행하며 발생된 에러를 errkey 값으로 보정하여 노출합니다. 다만 해당 에러 메시지는 많은 조건을 감안 하지 않았으며 알려진 정규식을 통해 판별하므로 100% 보장되지 않는점에 유의해주세요
이외 검사시 옵션 설정과 무관하게 phpSyntaxCheck 를 구동하는 파일인 `class-phpSyntaxCheck.php` 파일과 `index.php(예제소스 기준)` 은 검사대상에서 자동 제외됩니다.
자세한 내용은 아래의 표를 참고해주시기 바랍니다.
옵션 상세
설정 및 옵션 상세는 아래와 같습니다.
rootDir |
PHP 문법체크를 실행할 루트 디렉토리들을 절대경로 형태로 지정
예제) $psc->set('rootDir',array($_SERVER['DOCUMENT_ROOT'])); |
allowDirList |
허용 디렉토리 목록을 절대경로 형태로 지정, 이 값이 있을 경우 해당 디렉토리들만 체크한다.
예제) $psc->set('allowDirList',array($_SERVER['DOCUMENT_ROOT'].'/user')); |
denyDirList |
제외 디렉토리 목록을 절대경로 형태로 지정
예제) $psc->set('denyDirList',array($_SERVER['DOCUMENT_ROOT'].'/secure')); |
allowFileList |
허용가능 파일이름(확장자 포함)을 지정
예제) $psc->set('allowFileList',array('cron.php')); |
denyFileList |
제외할 파일이름(확장자 포함)을 지정 (우선순위 높음)
예제) $psc->set('denyFileList',array('secure.php')); |
errlogDir |
에러로그를 남길 디렉토리 (해당 디렉토리는 기본적으로 757 이상의 권한을 가져야함)
예제) $psc->set('denyFileList','./log'); |
debug |
디버깅된 내용을 출력할 경우 true, 그렇지 않을 경우 false
예제) $psc->set('debug',true); |
filechk |
Notice 와 같이 php -l 로 확인 불가능한 경고성 에러도 추출할 수 있다. 단 PHP를 직접 실행하기 때문에 주의가 필요하며 가공된 출력 데이터를 활용하기 때문에 발생되는 오류에 대해 100% 보장되지 않는다.
예제) $psc->set('filechk',true); |
errkey |
filechk 가 true 일 경우 체크될 정규식을 지정한다. (기본적으로 수정이 불필요하다.)
예제) $psc->set('errkey',array('PHP Notice','PHP Fatal error','PHP Parse error','PHP Warning')); |
참고로 옵션값의 경우 클래스 초기화 시 생성자를 통해 아래와 같이 설정할 수 있습니다.
$psc = new phpSyntaxCheck(array('rootDir'=>array($_SERVE['DOCUMENT_ROOT']), 'debug'=>true ));
사용가능한 메서드
아래와 같이 사용 가능한 메서드가 있습니다.
set |
옵션을 설정할 수 있는 메서드 예제) $psc->set('설정키값','설정값'); |
apply |
문법검사를 실행하는 메서드
예제) $psc->apply();
결과값의 경우 아래와 같습니다.
|
async |
비동기 통신으로 실행하며, 지정된 URL에는 비동기 통신으로 처리할 프로그램이 구성되어있어야함 예제) $psc->async('실행할 URL 주소'); |
pr |
변수를 보기 좋기 출력 (print_r() 함수) 예제) $psc->pr(확인할변수); |
errlog |
파일로 에러로그를 생성(파일명은 제외시 `date{Ymd}-error.log` 형태로 생성) 예제) $psc->errlog('로그내용','파일명'); |
위의 언급된 메서드이외에는 별도로 사용이 불필요 하기때문에 제외 되었습니다.
버전 & 이력
본 phpSyntaxCheck 라이브러리 버전은 1.0 입니다. 자세한 이력은 아래를 참고해 주세요
|
서포트 & 기타
본 라이브러리를 통한 메일발송이 잘 안되시거나 오류 및 버그가 있을 경우 lcy@redinfo.co.kr 로 문의 주시면 최대한 빠른 시일 내 답변 드릴 수 있도록 하겠습니다.