具有文件句柄的Php函数循环

时间:2012-07-11 08:20:18

标签: php eof fgets

这个函数在我的服务器上造成了很大的麻烦,因为它处于循环中:

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是资源,在第42行的/path/file.php中给出布尔值”

感兴趣的一行是:

$line = fgets($file_handle);

功能还可以,但我不知道为什么要给我这个奇怪的错误。

4 个答案:

答案 0 :(得分:4)

因为$file_handle是布尔false(您可以使用var_dump检查),而fopen调用失败则会发生这种情况。

  

fopen

     

成功时返回文件指针资源,错误时返回FALSE。

答案 1 :(得分:2)

试试这个:

$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);
}

答案 2 :(得分:1)

嗯,在尝试打开文件之前,为保护代码,只需要很少的建议就可以执行此测试:

$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.

答案 3 :(得分:0)

可能fopen失败是因为您没有该文件的权限,或者您错过了匹配路径。

但是你要循环到fgets();这意味着没有文件结束。

尝试放$line = fgets($file_handle,4096);并查看它是否有效。