Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add spark optimize command #8610

Merged
merged 5 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions system/Autoloader/FileLocatorCached.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ private function saveCache(): void
*/
public function deleteCache(): void
{
$this->cacheUpdated = false;
$this->cacheHandler->delete($this->cacheKey);
}

Expand Down
149 changes: 149 additions & 0 deletions system/Commands/Utilities/Optimize.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?php

declare(strict_types=1);

/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <admin@codeigniter.com>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/

namespace CodeIgniter\Commands\Utilities;

use CodeIgniter\Autoloader\FileLocator;
use CodeIgniter\Autoloader\FileLocatorCached;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
use CodeIgniter\Publisher\Publisher;
use RuntimeException;

/**
* Optimize for production.
*/
final class Optimize extends BaseCommand
{
/**
* The group the command is lumped under
* when listing commands.
*
* @var string
*/
protected $group = 'CodeIgniter';

/**
* The Command's name
*
* @var string
*/
protected $name = 'optimize';

/**
* The Command's short description
*
* @var string
*/
protected $description = 'Optimize for production.';

/**
* The Command's usage
*
* @var string
*/
protected $usage = 'optimize';

/**
* {@inheritDoc}
*/
public function run(array $params)
{
try {
$this->enableCaching();
$this->clearCache();
$this->removeDevPackages();
} catch (RuntimeException) {
CLI::error('The "spark optimize" failed.');

return EXIT_ERROR;
}

return EXIT_SUCCESS;
}

private function clearCache(): void
{
$locator = new FileLocatorCached(new FileLocator(service('autoloader')));
$locator->deleteCache();
CLI::write('Removed FileLocatorCache.', 'green');

$cache = WRITEPATH . 'cache/FactoriesCache_config';
$this->removeFile($cache);
}

private function removeFile(string $cache): void
{
if (is_file($cache)) {
$result = unlink($cache);

if ($result) {
CLI::write('Removed "' . clean_path($cache) . '".', 'green');

return;
}

CLI::error('Error in removing file: ' . clean_path($cache));

throw new RuntimeException(__METHOD__);
}
}

private function enableCaching(): void
{
$publisher = new Publisher(APPPATH, APPPATH);

$config = APPPATH . 'Config/Optimize.php';

$result = $publisher->replace(
$config,
[
'public bool $configCacheEnabled = false;' => 'public bool $configCacheEnabled = true;',
'public bool $locatorCacheEnabled = false;' => 'public bool $locatorCacheEnabled = true;',
]
);

if ($result) {
CLI::write(
'Config Caching and FileLocator Caching are enabled in "app/Config/Optimize.php".',
'green'
);

return;
}

CLI::error('Error in updating file: ' . clean_path($config));

throw new RuntimeException(__METHOD__);
}

private function removeDevPackages(): void
{
if (! defined('VENDORPATH')) {
return;
}

chdir(ROOTPATH);
passthru('composer install --no-dev', $status);

if ($status === 0) {
CLI::write('Removed Composer dev packages.', 'green');

return;
}

CLI::error('Error in removing Composer dev packages.');

throw new RuntimeException(__METHOD__);
}
}
2 changes: 2 additions & 0 deletions user_guide_src/source/changelogs/v4.5.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ Enhancements
Commands
========

- Added ``spark optimize`` command to optimize configuration for production environment.
See :ref:`spark_optimize` for the details.
- Added ``spark make:test`` command to generate a skeleton test file. See
:ref:`cli-generators-make-test` for the details.
- Added ``spark config:check`` command to check Config values. See
Expand Down
5 changes: 5 additions & 0 deletions user_guide_src/source/concepts/autoloader.rst
Original file line number Diff line number Diff line change
Expand Up @@ -187,13 +187,18 @@ You can use the ``spark cache:clear`` command:

Or simply delete the **writable/cache/FileLocatorCache** file.

.. note::
The ``spark optimize`` command clears the cache.

How to Enable FileLocator Caching
=================================

Set the following property to ``true`` in **app/Config/Optimize.php**::

public bool $locatorCacheEnabled = true;

Or you can enable it with the ``spark optimize`` command.

.. note::
This property cannot be overridden by
:ref:`environment variables <configuration-classes-and-environment-variables>`.
5 changes: 5 additions & 0 deletions user_guide_src/source/concepts/factories.rst
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,9 @@ You can use the ``spark cache:clear`` command:

Or simply delete the **writable/cache/FactoriesCache_config** file.

.. note::
Since v4.5.0, the ``spark optimize`` command clears the cache.

How to Enable Config Caching
============================

Expand All @@ -322,6 +325,8 @@ Set the following property to ``true`` in **app/Config/Optimize.php**::

public bool $configCacheEnabled = true;

Since v4.5.0, you can enable this with the ``spark optimize`` command.

.. note::
This property cannot be overridden by
:ref:`environment variables <configuration-classes-and-environment-variables>`.
Expand Down
13 changes: 13 additions & 0 deletions user_guide_src/source/installation/deployment.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,19 @@ things you can do to make your application run more efficiently.

This section describes the optimization features that CodeIgniter provides.

.. _spark_optimize:

spark optimize
==============

.. versionadded:: 4.5.0

The ``spark optimize`` command performs the following optimizations:

- `Removing Dev Packages`_
- Enabling `Config Caching`_
- Enabling `FileLocator Caching`_

Composer Optimization
=====================

Expand Down
Loading