1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-27 04:45:20 +01:00

Disable opcache.preload if it's enabled

Fixes vimeo/psalm#9382

Also reorganized the opcache settings check a bit and enforced
`opcache.jit_buffer_size`
This commit is contained in:
Bruce Weirdan 2023-02-23 22:14:58 -04:00
parent 5390c212ba
commit ea32d203b6
No known key found for this signature in database
GPG Key ID: CFC3AAB181751B0D

View File

@ -14,6 +14,8 @@ use function implode;
use function in_array;
use function ini_get;
use function preg_replace;
use function strlen;
use function strtolower;
use const PHP_VERSION_ID;
@ -22,6 +24,14 @@ use const PHP_VERSION_ID;
*/
class PsalmRestarter extends XdebugHandler
{
private const REQUIRED_OPCACHE_SETTINGS = [
'enable_cli' => true,
'jit' => 1205,
'jit_buffer_size' => 512 * 1024 * 1024,
'optimization_level' => '0x7FFEBFFF',
'preload' => '',
];
private bool $required = false;
/**
@ -53,28 +63,54 @@ class PsalmRestarter extends XdebugHandler
static fn(string $extension): bool => extension_loaded($extension)
);
if (PHP_VERSION_ID >= 8_00_00 && (extension_loaded('opcache') || extension_loaded('Zend OPcache'))) {
$opcache_loaded = extension_loaded('opcache') || extension_loaded('Zend OPcache');
if (PHP_VERSION_ID >= 8_00_00 && $opcache_loaded) {
// restart to enable JIT if it's not configured in the optimal way
if (!in_array(ini_get('opcache.enable_cli'), ['1', 'true', true, 1])) {
return true;
}
$opcache_settings = [
'enable_cli' => in_array(ini_get('opcache.enable_cli'), ['1', 'true', true, 1]),
'jit' => (int) ini_get('opcache.jit'),
'optimization_level' => (string) ini_get('opcache.optimization_level'),
'preload' => (string) ini_get('opcache.preload'),
'jit_buffer_size' => self::toBytes(ini_get('opcache.jit_buffer_size')),
];
if (((int) ini_get('opcache.jit')) !== 1205) {
return true;
}
if (((int) ini_get('opcache.jit')) === 0) {
return true;
}
if (ini_get('opcache.optimization_level') !== '0x7FFEBFFF') {
return true;
foreach (self::REQUIRED_OPCACHE_SETTINGS as $ini_name => $required_value) {
if ($opcache_settings[$ini_name] !== $required_value) {
return true;
}
}
}
return $default || $this->required;
}
private static function toBytes(string $value): int
{
$unit = strtolower($value[strlen($value) - 1]);
if (in_array($unit, ['g', 'm', 'k'], true)) {
$value = (int) $value;
} else {
$unit = '';
$value = (int) $value;
}
switch ($unit) {
case 'g':
$value *= 1024;
// no break
case 'm':
$value *= 1024;
// no break
case 'k':
$value *= 1024;
}
return $value;
}
/**
* No type hint to allow xdebug-handler v1 and v2 usage
*
@ -93,17 +129,19 @@ class PsalmRestarter extends XdebugHandler
}
$additional_options = [];
$opcache_loaded = extension_loaded('opcache') || extension_loaded('Zend OPcache');
// executed in the parent process (before restart)
// if it wasn't loaded then we apparently don't have opcache installed and there's no point trying
// to tweak it
// If we're running on 7.4 there's no JIT available
if (PHP_VERSION_ID >= 8_00_00 && (extension_loaded('opcache') || extension_loaded('Zend OPcache'))) {
if (PHP_VERSION_ID >= 8_00_00 && $opcache_loaded) {
$additional_options = [
'-dopcache.enable_cli=true',
'-dopcache.jit_buffer_size=512M',
'-dopcache.jit=1205',
'-dopcache.optimization_level=0x7FFEBFFF',
'-dopcache.preload=',
];
}