@ -381,8 +381,25 @@ trait SourcePipelineTrait
$otherFiles = [];
$otherFiles = [];
$vendorRoots = [];
$vendorRoots = [];
$vendorFiles = [];
$vendorFiles = [];
$anonymousFiles = [];
$fileCacheDirs = [];
$fileCacheDirs = [];
foreach ($files as $file) {
foreach ($files as $file) {
if (isset($this->anonymousOpcodeKeys[$file])) {
// These files are emitted by this compiler, so their exact
// contents provide a safe cache key independent of any
// user-supplied directory timestamp.
$key = hash('sha256', implode("\n", [
'anonymous-opcodes-v1', $file,
hash_file('sha256', $file), $this->opcodeBuildSignature,
]));
$cacheDir = $this->getBuildDir() . '/cache/opcache/anonymous-' . substr($key, 0, 20);
if ($this->climate->arguments->defined('force')) {
$this->clearOpcodeCacheDirectory($cacheDir);
}
$fileCacheDirs[$file] = $cacheDir;
$anonymousFiles[$file] = true;
continue;
}
$vendorRoot = $this->vendorRootForOpcodeFile($file);
$vendorRoot = $this->vendorRootForOpcodeFile($file);
if ($vendorRoot === null) {
if ($vendorRoot === null) {
$otherFiles[] = $file;
$otherFiles[] = $file;
@ -446,12 +463,17 @@ PHP
// function names do not conflict while creating their bytecode.
// function names do not conflict while creating their bytecode.
$pending = [];
$pending = [];
$vendorHits = 0;
$vendorHits = 0;
$anonymousHits = 0;
foreach ($files as $file) {
foreach ($files as $file) {
$cacheDir = $fileCacheDirs[$file];
$cacheDir = $fileCacheDirs[$file];
if (isset($vendorFiles[$file])
if (( isset($vendorFiles[$file]) || isset($anonymousFiles[$file]) )
& & ($blob = $this->findOpcodeBlob($cacheDir, $file)) !== null) {
& & ($blob = $this->findOpcodeBlob($cacheDir, $file)) !== null) {
$blobs[$file] = $blob;
$blobs[$file] = $blob;
if (isset($anonymousFiles[$file])) {
++$anonymousHits;
} else {
++$vendorHits;
++$vendorHits;
}
} else {
} else {
$pending[] = $file;
$pending[] = $file;
}
}
@ -464,6 +486,13 @@ PHP
'lightBlue',
'lightBlue',
);
);
}
}
if ($anonymousFiles !== []) {
$this->output(
'Anonymous opcode cache: ' . $anonymousHits . ' reused, '
. (count($anonymousFiles) - $anonymousHits) . ' to generate',
'lightBlue',
);
}
$progress = $this->startOpcodeProgress('Opcodes', count($pending));
$progress = $this->startOpcodeProgress('Opcodes', count($pending));
$completed = 0;
$completed = 0;
foreach ($pending as $file) {
foreach ($pending as $file) {