addArgument( 'php-major-version', InputArgument::REQUIRED, 'PHP major version (supported: 7.4, 8.0, 8.1, 8.2, 8.3)', null, fn () => ['7.4', '8.0', '8.1', '8.2', '8.3'] ); $this->no_motd = true; $this->addOption('retry', 'R', InputOption::VALUE_REQUIRED, 'Set retry time when downloading failed (default: 0)', '0'); } public function handle(): int { $php_ver = $this->input->getArgument('php-major-version'); if (!in_array($php_ver, ['7.4', '8.0', '8.1', '8.2', '8.3'])) { $this->output->writeln('Invalid PHP major version ' . $php_ver . ' !'); return static::FAILURE; } // detect if downloads/.lock.json exists $lock_file = DOWNLOAD_PATH . '/.lock.json'; // parse php-src part of lock file $lock_data = json_decode(file_get_contents($lock_file), true); // get php-src downloaded file name $php_src = $lock_data['php-src']; $file = DOWNLOAD_PATH . '/' . ($php_src['filename'] ?? '.donot.delete.me'); if (file_exists($file)) { $this->output->writeln('Removing old PHP source...'); unlink($file); } // Download new PHP source $this->output->writeln('Downloading PHP source...'); define('SPC_BUILD_PHP_VERSION', $php_ver); // retry $retry = intval($this->getOption('retry')); f_putenv('SPC_RETRY_TIME=' . $retry); Downloader::downloadSource('php-src', Config::getSource('php-src')); // Remove source/php-src dir FileSystem::removeDir(SOURCE_PATH . '/php-src'); $this->output->writeln('Switched to PHP ' . $php_ver . ' successfully!'); return static::SUCCESS; } }