2017-04-04 11 views
1

오늘 웹 서버 관리자로부터 "귀하의 서비스가 약 60GB의 오류 파일로 인해 일시 중지되었습니다 .FTP를 통해 errorlog.txt를 확인하십시오."라는 이메일을 받았습니다.PHP에서 fgetc() 매개 변수 오류가 발생했습니다.

<? 
header("X-XSS-Protection: 0"); 
$filename= $_GET['filename']; 
$code = $_POST['code']; 
if (isset($filename)) 
{ 
    $go = $filename; 
    $full = "docs/$filename.htm"; 
    $filename = @fopen($full , 'r'); 
    $file_size = filesize($full); 
    while (! feof($filename)) //line 11 
    { 
     $char = fgetc ($filename); //line13 
     $code .= "$char"; 
    } 
    fclose($filename); 
} 
    $code = str_replace("\\", "", $code); 
$code = str_replace("&gt;", ">", $code); 
$code = str_replace("&#61;", "=", $code); 
$code = str_replace("&lt;", "<", $code); 

printf("%s",$code); 
?> 

문제가 여기에 무엇 : 상대 코드 조각이 여기

[Tue Apr 04 08:45:52 2017] [error] [client xxx.xxx.xxx.xxx] PHP Warning: feof() expects parameter 1 to be resource, boolean given in /var/www/vhosts/.../httpdocs/dene.php on line 11 
[Tue Apr 04 08:45:52 2017] [error] [client xxx.xxx.xxx.xxx] PHP Warning: fgetc() expects parameter 1 to be resource, boolean given in /var/www/vhosts/.../httpdocs/dene.php on line 13 

그리고 : 로그 파일에서이 단 두 줄이 repeteadly입니까? 미리 감사드립니다 ...

+1

[* "'fopen'이 :. error__에 파일 포인터의 성공에 자원, __or FALSE를 돌려"* (http://php.net/manual php manual에서

$resource = @fopen($filename , 'r'); if ($resource) { while (! feof($resource)) { ... } } 

/en/function.fopen.php#refsect1-function.fopen-returnvalues) –

답변

0

로 이름을 변경해야 실제로하지 않습니다 fopen 결과.

<?php 
// if file can not be read or doesn't exist fopen function returns FALSE 
$file = @fopen("no_such_file", "r"); 

// FALSE from fopen will issue warning and result in infinite loop here 
while (!feof($file)) { 
} 

fclose($file); 
?> 
0

feoffgetc에 유효한 리소스를 매개 변수로 전달하지 않아이 오류가 발생합니다. 당신은 당신이 유효한 파일 포인터를 전달하고 있는지 확인해야합니다

$filename = @fopen($full , 'r'); 

당신은 확인해야합니다

  1. 열려고하는 파일은
  2. 존재 그리고 그것은 올바른 권한이 있습니다. (필요한 경우 chmod 775)

위의 오류 중 하나가 실패하면 $ filename은 false을 반환합니다. 다음과 같이이 오류 조건을 처리하는 코드의 논리를 향상시킬 수

$filename = @fopen($full, 'r'); 
// Make sure we have a valid file resource 
if ($filename) { 
    $file_size = filesize($full); 
    while (! feof($filename)) 
    { 
     $char = fgetc($filename); 
     $code .= "$char"; 
    } 
    fclose($filename); 
} else { 
    // Not a valid file resource 
    die("This file resource could not be open."); 
} 

참고 :$filename 올바른 변수 이름, 당신은 당신은 확인이 필요 $filePointer 또는 $fp