2009-08-10 10 views
1

동적으로 생성 된 PHP 파일이 다른 PHP 스크립트에 포함되어 있습니다. 첫 번째 애매한 이유로 인해 파싱 오류가 발생하면 주 스크립트 구문 분석 오류로 인해 실행이 중단됩니다.PHP는 구문 분석 오류가있는 파일을 포함합니다.

동적으로 해당 파일을 다시 생성 할 수 있도록 파일을 포함 할 때 구문 분석 오류를 감지하는 방법이 있습니까?

+3

는 소리 당신이 포함 된 스크립트 구문 분석 - 오류가 발생하는 문제를 해결해야처럼. 나는 그것들을 탐지하는 것에 대해 확신하지 못한다. 그러나 만약 한 번 오류가 있다면 같은 방법으로 다시 생성 되었다면 다시 오류가되는 것처럼 보일 것이다. –

+0

잘못된 파일이나 전원 장애 또는 서버 오류와 같은 상황이 발생할 수있는 다른 경우가 있습니다. – jab

답변

3

당신은 구문을 확인하는 PHP의 명령 행 버전을 실행할 수 있습니다 : 당신이 PHP 스크립트 내에서 구문을 확인해야하는 경우 명령 줄 프로그램을 호출 할 exec() 기능을 사용

php -l filename 

.

php_check_syntax()

+1

5.0.4 이후에 제공되지 않습니다. –

+0

그냥 ... 내 대답을 변경했습니다. –

+1

'php_check_syntax()'와 같은 함수 호출이 새로운 프로세스를 생성하는 것보다 훨씬 빠르다는 것을 상상할 수 있습니다. $ 0 path가 파일 이름 일 경우 php 코드를 제공하지 않을 것입니다 ( – rustyx

0

당신은 php -l file.php을 (exec() 또는 이와 유사한 사용) 실행하고 결과를 볼 수 있었다 사용되지 않는 기능을 참조하십시오. 모든 포함에 대해 이렇게하는 것이 느려질 것입니다.

때때로 유효하지 않은 PHP 파일을 생성하는 원인을 수정하는 것이 좋지 않습니까?

-2

file_get_contents을 수행 한 다음이를 스캔하여 구문 분석 오류가 있는지 확인할 수 있습니다.

$contents = file_get_contents($path); 
if (stripos($contents, 'Parse error:') !== 0) 
{ 
    // There was a parse error. 
} else { 
    // There were no parse errors. 
} 
+2

). ? –

0

나는 코드 트리를 거쳐 구문 오류를 찾을 스크립트가 있습니다. 그것의 매우 고급하지만, 그것의 기본이 당신이 포함하려고 스크립트에서 PHP는 -l을 실행하고

$cmd="php -l " . $basedir . $dir . "/" . $file; 
$s=exec($cmd,$k); 
if(strstr($s,"No syntax errors detected")) { include($basedir.$dir."/".$file); } 

하지 아니 errrors 부하가없는 경우.

0

shell_exec()를 실행하면 명령 줄을 통해 해당 파일을 실행 한 것처럼 출력을 볼 수 있습니다. 바로 여기에 오류가 있는지 확인할 수 있습니다.

<?php 
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) { 
    die('An error!'); 
} 
1

SYNTAX.php filename.php

SYNTAX.php은

:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors','On'); 

include($_SERVER['QUERY_STRING']); 
?> 
0

당신이 항상 달성하기 쉬워야한다 올바르게 구문 분석 코드를 (생성을 보장 할 수있는 경우 적절한 탈출 등), 파일을 쓰는 프로세스가 중단되면 (예 : 정전, 메모리 부족, 프로세스 종료 등) 오류가 발생할 수있는 유일한 방법입니다. 이 경우 부분 파일로 끝납니다.

파일 끝에 서명을 추가하고 include()를 호출하기 전에 존재 여부를 확인하여 이러한 부분 쓰기로부터 보호 할 수 있습니다. 당신이 마지막에 <?php $complete=1; ?>를 작성하는 경우

예를 들어, 나중에 그 존재를 확인할 수 있습니다

$contents = file_get_contents($path); 
if (strpos($contents, '<?php $complete=1; ?>')) { 
    include($path); 
} 
관련 문제