Skip to content

Commit

Permalink
Merge pull request #8610 from kenjis/feat-add-spark-optimize
Browse files Browse the repository at this point in the history
feat: add `spark optimize` command
  • Loading branch information
kenjis authored Mar 28, 2024
2 parents e131c46 + 46e3348 commit 301ffb8
Show file tree
Hide file tree
Showing 6 changed files with 175 additions and 0 deletions.
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 <[email protected]>
*
* 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

0 comments on commit 301ffb8

Please sign in to comment.