Цикл функции Php с дескриптором файла

Эта функция вызывает большие проблемы на моем сервере, потому что она находится в цикле:

function loadFiles()
{
$email = $_POST["emailp"];
$file_handle = fopen("/tmpphp/dmbigmail.file", "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
if(stristr($line,$email)){
    $show = trim(str_replace($email,' ',$line));
    //echo $show;
    $parsedata = substr($show,0,11);
    $parselink = substr($show,10);
    $total = $parsedata.'<a href=' . $parselink. ">$parselink</a><br>";
    echo $total;
    }
     }
     fclose($file_handle);
 }

В моем журнале я вижу это: «Предупреждение PHP: fgets() ожидает, что параметр 1 будет ресурсом, логическим значением, заданным в /path/file.php в строке 42»

Интересует строка:

$line = fgets($file_handle);

Функция в порядке, но я не знаю, почему выдает мне эту странную ошибку.


person user840718    schedule 11.07.2012    source источник


Ответы (4)


Поскольку $file_handle является логическим значением false (это можно проверить с помощью var_dump), что, в свою очередь, происходит из-за того, что fopen вызов завершается ошибкой.

fopen

Возвращает ресурс указателя файла в случае успеха или FALSE в случае ошибки.

person Jon    schedule 11.07.2012
comment
Разве feof не должен также ожидать, что параметр 1 будет ресурсом? - person xdazz; 11.07.2012
comment
@xdazz: Да, но вполне возможно, что нам не все рассказывают. - person Jon; 11.07.2012

попробуй это :

$file_handle = @fopen("/tmpphp/dmbigmail.file", "r");
if ($file_handle) {
    while (($line = fgets($file_handle, 4096)) !== false) {
      if(stristr($line,$email)){
            $show = trim(str_replace($email,' ',$line));
            //echo $show;
            $parsedata = substr($show,0,11);
            $parselink = substr($show,10);
            $total = $parsedata.'<a href=' . $parselink. ">$parselink</a><br>";
            echo $total;
        }
    }
    if (!feof($file_handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($file_handle);
}
person Fredy    schedule 11.07.2012

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

$filepath = "/tmpphp/dmbigmail.file";
if (!file_exists($filepath) || !is_file($filepath)) {
  echo "$filepath not found or it is not a file."; exit; //return; //die();
}
if ($file_handle = fopen($filepath, "r")) {
....etc.
person Stano    schedule 11.07.2012

Вероятно, fopen не работает, потому что у вас нет прав доступа к этому файлу или вы не указали путь.

Но вы зацикливаетесь на fgets(); что означает отсутствие конца файла.

Попробуйте поставить $line = fgets($file_handle,4096); и посмотрите, работает ли он.

person Rosmarine Popcorn    schedule 11.07.2012