0

我有以下代码可以从文件中读取,并在一些计算后写回它。

    if(file_exists(CACHE_FILE_PATH)) {
        //read the cache and delete that line!
        $inp = array();
        $cache = fopen(CACHE_FILE_PATH, 'r');
        if($cache) {
            while(!feof($cache)) {
                $tmp = fgets($cache);
                //some logic with $tmp
                    $inp[] = $tmp;
            }

            fclose($cache);
        }

        var_dump($inp);

        $cache = fopen(CACHE_FILE_PATH, 'w');

        var_dump($inp);
        if($cache) {

            var_dump($inp);

            foreach ($inp as $val) {
                echo "\nIN THE LOOP";
                fwrite($val."\n");
            }

            fclose($cache);
        }   
    }

var_dumps 的输出是:

array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}
array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}
array(3) {
  [0]=>
  string(13) "bedupako|714
"
  [1]=>
  string(16) "newBedupako|624
"
  [2]=>
  string(19) "radioExtension|128
"
}

即使它是一个数组,它也不会进入循环和打印IN THE LOOP!为什么?

4

1 回答 1

3

这部分代码:

fwrite($val."\n");

应该:

fwrite($cache, $val); // the "\n" is only required if it was stripped off after fgets()

的第一个参数fwrite()必须是用 . 打开的文件描述符fopen()

当然,如果您在开发过程中打开电源error_reporting(-1)ini_set('display_errors', 'On')您会立即发现这一点 :)

正如评论中所建议的那样,您应该尝试通过使用诸如file()将整个文件读入行数组然后使用join()file_put_contents()写回整个内容的结构来简化代码。

如果您只想要一个键/值对的缓存,您可以查看如下内容:

// to read, assuming the cache file exists
$cache = include CACHE_FILE_PATH;

// write back cache
file_put_contents(CACHE_FILE_PATH, '<?php return ' . var_export($cache, true) . ';');

它读取和写入包含 PHP 本身可以读取的数据结构的文件(比您快得多)。

于 2012-12-10T15:20:07.417 回答