[HttpKernel] Update FileProfileStorage to search from EOF
This commit is contained in:
parent
188a5fa1ab
commit
b7032bc971
@ -54,11 +54,28 @@ class FileProfilerStorage implements ProfilerStorageInterface
|
|||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$file = fopen($file, 'r');
|
$file = fopen($file, 'r');
|
||||||
|
fseek($file, 0, SEEK_END);
|
||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
while (!feof($file) && $limit > 0) {
|
while ($limit > 0) {
|
||||||
list($csvToken, $csvIp, $csvUrl, $csvTime, $csvParent) = fgetcsv($file);
|
$line = $this->readLineFromFile($file);
|
||||||
|
|
||||||
|
if (false === $line) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line === "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($csvToken, $csvIp, $csvUrl, $csvTime, $csvParent) = str_getcsv($line);
|
||||||
|
|
||||||
|
if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$row = array(
|
$row = array(
|
||||||
'token' => $csvToken,
|
'token' => $csvToken,
|
||||||
'ip' => $csvIp,
|
'ip' => $csvIp,
|
||||||
@ -67,10 +84,6 @@ class FileProfilerStorage implements ProfilerStorageInterface
|
|||||||
'parent' => $csvParent
|
'parent' => $csvParent
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$result[] = $row;
|
$result[] = $row;
|
||||||
$limit--;
|
$limit--;
|
||||||
}
|
}
|
||||||
@ -118,6 +131,7 @@ class FileProfilerStorage implements ProfilerStorageInterface
|
|||||||
public function write(Profile $profile)
|
public function write(Profile $profile)
|
||||||
{
|
{
|
||||||
$file = $this->getFilename($profile->getToken());
|
$file = $this->getFilename($profile->getToken());
|
||||||
|
$exists = file_exists($file);
|
||||||
|
|
||||||
// Create directory
|
// Create directory
|
||||||
$dir = dirname($file);
|
$dir = dirname($file);
|
||||||
@ -139,7 +153,7 @@ class FileProfilerStorage implements ProfilerStorageInterface
|
|||||||
));
|
));
|
||||||
fclose($file);
|
fclose($file);
|
||||||
|
|
||||||
return true;
|
return ! $exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,4 +179,45 @@ class FileProfilerStorage implements ProfilerStorageInterface
|
|||||||
{
|
{
|
||||||
return $this->folder.'/'.'index.csv';
|
return $this->folder.'/'.'index.csv';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a line in the file, ending with the current position.
|
||||||
|
*
|
||||||
|
* This function automatically skips the empty lines and do not include the line return in result value.
|
||||||
|
*
|
||||||
|
* @param resource $file The file resource, with the pointer placed at the end of the line to read
|
||||||
|
*
|
||||||
|
* @return mixed A string representating the line or FALSE if beginning of file is reached
|
||||||
|
*/
|
||||||
|
protected function readLineFromFile($file)
|
||||||
|
{
|
||||||
|
if (ftell($file) === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek($file, -1, SEEK_CUR);
|
||||||
|
$str = '';
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
$char = fgetc($file);
|
||||||
|
|
||||||
|
if ($char === "\n") {
|
||||||
|
// Leave the file with cursor before the line return
|
||||||
|
fseek($file, -1, SEEK_CUR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$str = $char . $str;
|
||||||
|
|
||||||
|
if (ftell($file) === 1) {
|
||||||
|
// All file is read, so we move cursor to the position 0
|
||||||
|
fseek($file, -1, SEEK_CUR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek($file, -2, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str === "" ? $this->readLineFromFile($file) : $str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user