file io — ошибка параметра fgetc () feof () в переполнении стека

Сегодня я получил электронное письмо от моего веб-сервера. Администратор говорит, что «ваша служба приостановлена ​​из-за файла ошибок размером около 60 ГБ. Проверьте файл errorlog.txt по FTP». В лог-файле только эти две строки повторяются:

[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

А вот относительная часть кода:

<?
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);
?>

В чем здесь проблема? Заранее спасибо…

1

Решение

Вам нужно проверить fopen результат.

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

от Руководство по PHP:

<?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

Другие решения

Вы получаете эти ошибки, потому что вы не передаете действительный ресурс в качестве параметра в feof а также fgetc, Вы должны убедиться, что вы передаете действительный указатель файла в:

$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

0

По вопросам рекламы [email protected]