-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
[WIP][FrameworkBundle] Added server status command #5373
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
Closed
Closed
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
98 changes: 98 additions & 0 deletions
98
src/Symfony/Bundle/FrameworkBundle/Command/ServerStatusCommand.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Bundle\FrameworkBundle\Command; | ||
|
||
use Symfony\Component\Console\Input\InputArgument; | ||
use Symfony\Component\Console\Input\InputOption; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
use Symfony\Component\Process\ProcessBuilder; | ||
use Symfony\Bundle\FrameworkBundle\Requirement\SymfonyRequirements; | ||
use Symfony\Bundle\FrameworkBundle\Requirement\Requirement; | ||
|
||
/** | ||
* Checks if the server has all the requirements to run a Symfony2 application | ||
* | ||
* @author Tiago Ribeiro <[email protected]> | ||
* @author Rui Marinho <[email protected]> | ||
*/ | ||
class ServerStatusCommand extends ContainerAwareCommand | ||
{ | ||
protected $output; | ||
|
||
/** | ||
* @see Command | ||
*/ | ||
protected function configure() | ||
{ | ||
$this | ||
->setName('server:status') | ||
->setDescription('Checks if the server has all the requirements to run a Symfony2 application') | ||
->setHelp(<<<EOF | ||
The <info>%command.name%</info> checks several requirements | ||
from your server php.ini configuration | ||
EOF | ||
) | ||
; | ||
} | ||
|
||
/** | ||
* @see Command | ||
*/ | ||
protected function execute(InputInterface $input, OutputInterface $output) | ||
{ | ||
$this->output = $output; | ||
$symfonyRequirements = new SymfonyRequirements(); | ||
|
||
$iniPath = $symfonyRequirements->getPhpIniConfigPath(); | ||
|
||
$output->writeln($this->getHelper('formatter')->formatSection("Symfony", "Checking requirements\n")); | ||
|
||
if ($iniPath) { | ||
$output->writeln(sprintf("<fg=yellow>Configuration file used by PHP: %s</>", $iniPath)); | ||
} else { | ||
$output->writeln(sprintf("<fg=red>WARNING: No configuration file (php.ini) used by PHP!</>")); | ||
} | ||
|
||
$this->renderTitle('Mandatory requirements'); | ||
|
||
foreach ($symfonyRequirements->getRequirements() as $req) { | ||
$this->renderRequirement($req); | ||
} | ||
|
||
$this->renderTitle('Optional recommendations'); | ||
|
||
foreach ($symfonyRequirements->getRecommendations() as $req) { | ||
$this->renderRequirement($req); | ||
} | ||
} | ||
|
||
protected function renderTitle($title) | ||
{ | ||
$this->output->writeln(''); | ||
$this->output->writeln($this->getHelper('formatter')->formatSection("Symfony", sprintf("%s", $title))); | ||
$this->output->writeln(''); | ||
} | ||
|
||
/** | ||
* Prints a Requirement instance | ||
*/ | ||
protected function renderRequirement(Requirement $requirement) | ||
{ | ||
$result = $requirement->isFulfilled() ? 'OK' : ($requirement->isOptional() ? 'WARNING' : 'ERROR'); | ||
$this->output->write(' ' . str_pad($result, 9) . $requirement->getTestMessage() . "\n"); | ||
|
||
if (!$requirement->isFulfilled()) { | ||
$this->output->write(sprintf(" %s\n\n", $requirement->getHelpText())); | ||
} | ||
} | ||
} |
66 changes: 66 additions & 0 deletions
66
src/Symfony/Bundle/FrameworkBundle/Requirement/PhpIniRequirement.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Bundle\FrameworkBundle\Requirement; | ||
|
||
/** | ||
* Represents a PHP requirement in form of a php.ini configuration. | ||
* | ||
* @author Tobias Schultze <http://tobion.de> | ||
*/ | ||
class PhpIniRequirement extends Requirement | ||
{ | ||
/** | ||
* Constructor that initializes the requirement. | ||
* | ||
* @param string $cfgName The configuration name used for ini_get() | ||
* @param Boolean|callback $evaluation Either a Boolean indicating whether the configuration should evaluate to true or false, | ||
or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement | ||
* @param Boolean $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. | ||
This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. | ||
Example: You require a config to be true but PHP later removes this config and defaults it to true internally. | ||
* @param string $testMessage The message for testing the requirement (when null and $evaluation is a Boolean a default message is derived) | ||
* @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a Boolean a default help is derived) | ||
* @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) | ||
* @param Boolean $optional Whether this is only an optional recommendation not a mandatory requirement | ||
*/ | ||
public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) | ||
{ | ||
$cfgValue = ini_get($cfgName); | ||
|
||
if (is_callable($evaluation)) { | ||
if (null === $testMessage || null === $helpHtml) { | ||
throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.'); | ||
} | ||
|
||
$fulfilled = call_user_func($evaluation, $cfgValue); | ||
} else { | ||
if (null === $testMessage) { | ||
$testMessage = sprintf('%s %s be %s in php.ini', | ||
$cfgName, | ||
$optional ? 'should' : 'must', | ||
$evaluation ? 'enabled' : 'disabled' | ||
); | ||
} | ||
|
||
if (null === $helpHtml) { | ||
$helpHtml = sprintf('Set <strong>%s</strong> to <strong>%s</strong> in php.ini<a href="#phpini">*</a>.', | ||
$cfgName, | ||
$evaluation ? 'on' : 'off' | ||
); | ||
} | ||
|
||
$fulfilled = $evaluation == $cfgValue; | ||
} | ||
|
||
parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional); | ||
} | ||
} |
108 changes: 108 additions & 0 deletions
108
src/Symfony/Bundle/FrameworkBundle/Requirement/Requirement.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <[email protected]> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace Symfony\Bundle\FrameworkBundle\Requirement; | ||
|
||
/** | ||
* Represents a single PHP requirement, e.g. an installed extension. | ||
* It can be a mandatory requirement or an optional recommendation. | ||
* There is a special subclass, named PhpIniRequirement, to check a php.ini configuration. | ||
* | ||
* This file must be compatible with PHP 5.2+. | ||
* | ||
* ************** CAUTION ************** | ||
* | ||
* DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN BY COMPOSER | ||
* | ||
* If you want to change this file, edit the one in the | ||
* SensioDistributionBundle instead. | ||
* | ||
* ************** CAUTION ************** | ||
* | ||
* @author Tobias Schultze <http://tobion.de> | ||
* @author Fabien Potencier <[email protected]> | ||
*/ | ||
class Requirement | ||
{ | ||
private $fulfilled; | ||
private $testMessage; | ||
private $helpText; | ||
private $helpHtml; | ||
private $optional; | ||
|
||
/** | ||
* Constructor that initializes the requirement. | ||
* | ||
* @param Boolean $fulfilled Whether the requirement is fulfilled | ||
* @param string $testMessage The message for testing the requirement | ||
* @param string $helpHtml The help text formatted in HTML for resolving the problem | ||
* @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) | ||
* @param Boolean $optional Whether this is only an optional recommendation not a mandatory requirement | ||
*/ | ||
public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false) | ||
{ | ||
$this->fulfilled = (Boolean) $fulfilled; | ||
$this->testMessage = (string) $testMessage; | ||
$this->helpHtml = (string) $helpHtml; | ||
$this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText; | ||
$this->optional = (Boolean) $optional; | ||
} | ||
|
||
/** | ||
* Returns whether the requirement is fulfilled. | ||
* | ||
* @return Boolean true if fulfilled, otherwise false | ||
*/ | ||
public function isFulfilled() | ||
{ | ||
return $this->fulfilled; | ||
} | ||
|
||
/** | ||
* Returns the message for testing the requirement. | ||
* | ||
* @return string The test message | ||
*/ | ||
public function getTestMessage() | ||
{ | ||
return $this->testMessage; | ||
} | ||
|
||
/** | ||
* Returns the help text for resolving the problem | ||
* | ||
* @return string The help text | ||
*/ | ||
public function getHelpText() | ||
{ | ||
return $this->helpText; | ||
} | ||
|
||
/** | ||
* Returns the help text formatted in HTML. | ||
* | ||
* @return string The HTML help | ||
*/ | ||
public function getHelpHtml() | ||
{ | ||
return $this->helpHtml; | ||
} | ||
|
||
/** | ||
* Returns whether this is only an optional recommendation and not a mandatory requirement. | ||
* | ||
* @return Boolean true if optional, false if mandatory | ||
*/ | ||
public function isOptional() | ||
{ | ||
return $this->optional; | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need to extend ContainerAwareCommand when you dont use the container.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just waiting for feedback on whether we cleanup this command or close the PR.