我有以下代码从文件中读取,并在计算完成后写回。
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
!为什么呢?
答案 0 :(得分: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本身可以读取的数据结构的文件(比你快得多)。