问题描述
我正在尝试在文本文件中增加一个计数器,该计数器计算来自某些API的HTTP响应。目前,此部分已正确处理。我遇到的问题是,当我的文本文件具有两个以上需要增加的值时,仅更新一个字段,并且我不确定要更新另一个值的爆炸结构是什么。
文本文件的结构为:
api:one
success:1
fail:1
无论收到什么响应,都只会更新失败。
我目前的代码段是:
if ($status == "6" OR $status == "2") {
$filename = '/home/path/to/file/'.basename(__DIR__).'-responses.txt';
$lines = file($filename);
if(!is_file($filename)){
$default = 'api:one' . "\n" . 'success:1' . "\n" . 'fail:1';
file_put_contents($filename,$default);
} else {
foreach ($lines as $k=>$v) {
$exploded = explode(":",$v);
if ($exploded[0] == "fail") {
$exploded[1]++;
$lines[$k] = implode(":",$exploded);
}
}
file_put_contents($filename,$lines);
}
} else {
$filename = '/home/path/to/file/'.basename(__DIR__).'-responses.txt';
$lines = file($filename);
if(!is_file($filename)){
$default = 'api:one' . "\n" . 'success:1' . "\n" . 'fail:1';
file_put_contents($filename,$v);
if ($exploded[0] == "success") {
$exploded[1]++;
$lines[$k] = implode(":",$lines);
}
}
解决方法
问题是您在尝试增加数字之前没有从行中删除换行符。 success
行的末尾有换行符,当您尝试递增"1\n"
时,它什么也没做,因为那不是数字。
在创建数组时,使用FILE_IGNORE_NEW_LINES
选项删除换行符,然后在写回文件时将其重新添加。
if ($status == "6" OR $status == "2") {
$filename = '/home/path/to/file/'.basename(__DIR__).'-responses.txt';
if(!is_file($filename)){
$default = 'api:one' . "\n" . 'success:1' . "\n" . 'fail:1';
file_put_contents($filename,$default);
} else {
$lines = file($filename,FILE_IGNORE_NEW_LINES);
foreach ($lines as $k=>$v) {
$exploded = explode(":",$v);
if ($exploded[0] == "fail") {
$exploded[1]++;
$lines[$k] = implode(":",$exploded);
}
}
file_put_contents($filename,implode("\n",$lines));
}
} else {
$filename = '/home/path/to/file/'.basename(__DIR__).'-responses.txt';
if(!is_file($filename)){
$default = 'api:one' . "\n" . 'success:1' . "\n" . 'fail:1';
file_put_contents($filename,$v);
if ($exploded[0] == "success") {
$exploded[1]++;
$lines[$k] = implode(":",$lines));
}
}
此外,您应该在尝试读取文件之前 检查文件是否存在。