/** * reserveInstall * * @param ComposerFileWriter $writer * @param int $timeLimit */ protected function reserveOperation(ComposerFileWriter $writer, $timeLimit, $callback = null) { set_time_limit($timeLimit); ignore_user_abort(true); ini_set('allow_url_fopen', '1'); $memoryInBytes = function ($value) { $unit = strtolower(substr($value, -1, 1)); $value = (int) $value; switch ($unit) { case 'g': $value *= 1024; // no break (cumulative multiplier) // no break (cumulative multiplier) case 'm': $value *= 1024; // no break (cumulative multiplier) // no break (cumulative multiplier) case 'k': $value *= 1024; } return $value; }; $memoryLimit = trim(ini_get('memory_limit')); // Increase memory_limit if it is lower than 1GB if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1024) { ini_set('memory_limit', '1G'); } /** @var \Illuminate\Foundation\Application $app */ app()->terminating(function () use($writer, $callback) { $pid = getmypid(); Log::info("[plugin operation] start running composer run [pid={$pid}]"); // call `composer install` command programmatically $vendorName = PluginHandler::PLUGIN_VENDOR_NAME; $input = new ArrayInput(['command' => 'update', "--prefer-lowest", "--with-dependencies", '--working-dir' => base_path(), 'packages' => ["{$vendorName}/*"]]); $output = new BufferedOutput(); $application = new Application(); $application->setAutoExit(false); // prevent `$application->run` method from exitting the script if (!defined('__XE_PLUGIN_MODE__')) { define('__XE_PLUGIN_MODE__', true); } $code = $application->run($input, $output); $outputText = $output->fetch(); file_put_contents(storage_path('logs/plugin.log'), $outputText); if (is_callable($callback)) { $callback($code); } $writer->load(); if ($code !== 0) { $writer->set('xpressengine-plugin.operation.status', ComposerFileWriter::STATUS_FAILED); } else { $writer->set('xpressengine-plugin.operation.status', ComposerFileWriter::STATUS_SUCCESSED); } $writer->write(); Log::info("[plugin operation] plugin operation finished. [exit code: {$code}, memory usage: " . memory_get_usage() . "]"); }); }