/**
* Check the files.
*
* @param array $files
* @param bool $cache
*
* @return array
*/
public function lint($files = [], $cache = true)
{
if (empty($files)) {
$files = $this->getFiles();
}
$processCallback = is_callable($this->processCallback) ? $this->processCallback : function () {
};
$errors = [];
$running = [];
$newCache = [];
while (!empty($files) || !empty($running)) {
for ($i = count($running); !empty($files) && $i < $this->procLimit; ++$i) {
$file = array_shift($files);
$filename = $file->getRealpath();
if (!isset($this->cache[$filename]) || $this->cache[$filename] !== md5_file($filename)) {
$running[$filename] = new Lint(PHP_BINARY . ' -d error_reporting=E_ALL -d display_errors=On -l ' . escapeshellarg($filename));
$running[$filename]->start();
} else {
$newCache[$filename] = $this->cache[$filename];
}
}
foreach ($running as $filename => $lintProcess) {
if ($lintProcess->isRunning()) {
continue;
}
unset($running[$filename]);
if ($lintProcess->hasSyntaxError()) {
$processCallback('error', $filename);
$errors[$filename] = array_merge(['file' => $filename], $lintProcess->getSyntaxError());
} else {
$newCache[$filename] = md5_file($filename);
$processCallback('ok', $filename);
}
}
$cache && Cache::put($newCache);
}
return $errors;
}