Final Class Yiisoft\Requirements\RequirementsChecker
| Inheritance | Yiisoft\Requirements\RequirementsChecker |
|---|
RequirementsChecker allows checking, if current system meets the requirements for running the Yii application.
This class allows rendering of the check report for the web and console application interface.
Example:
use Yiisoft\Requirements\RequirementsChecker;
require_once('vendor/yiisoft/requirements/src/RequirementsChecker.php');
$requirementsChecker = new RequirementsChecker;
$requirements = [
[
'name' => 'PHP Some Extension',
'mandatory' => true`,
'condition' => extension_loaded('some_extension'),
'by' => 'Some application feature',
'memo' => 'PHP extension "some_extension" required',
],
];
$requirementsChecker
->check($requirements)
->render();
If you wish to render the report with your own representation, use {@see \Yiisoft\Requirements\getResult()} instead of {@see \Yiisoft\Requirements\render()}.
Requirement condition could be in format "eval:PHP expression". In this case specified PHP expression will be evaluated in the context of this class instance. For example:
$requirements = [
[
'name' => 'Upload max file size',
'condition' => 'eval:$this->checkUploadMaxFileSize("5M")',
],
];
Public Properties
| Property | Type | Description | Defined By |
|---|---|---|---|
| $result | array|null | The check results, this property is for internal usage only. | Yiisoft\Requirements\RequirementsChecker |
Public Methods
| Method | Description | Defined By |
|---|---|---|
| check() | Check the given requirements, collecting results into internal field. | Yiisoft\Requirements\RequirementsChecker |
| checkMaxExecutionTime() | Checks if the php.ini setting max_execution_time exceeds the execution time specified. |
Yiisoft\Requirements\RequirementsChecker |
| checkPhpExtensionVersion() | Checks if the given PHP extension is available and its version matches the given one. | Yiisoft\Requirements\RequirementsChecker |
| checkPhpIniOff() | Checks if PHP configuration option (from php.ini) is off. |
Yiisoft\Requirements\RequirementsChecker |
| checkPhpIniOn() | Checks if PHP configuration option (from php.ini) is on. |
Yiisoft\Requirements\RequirementsChecker |
| checkUploadMaxFileSize() | Checks if upload max file size matches the given range. | Yiisoft\Requirements\RequirementsChecker |
| compareByteSize() | Compare byte sizes of values given in the verbose representation, like '5M', '15K' etc. | Yiisoft\Requirements\RequirementsChecker |
| evaluateExpression() | Evaluates a PHP expression under the context of this class. | Yiisoft\Requirements\RequirementsChecker |
| getByteSize() | Gets the size in bytes from verbose size representation. | Yiisoft\Requirements\RequirementsChecker |
| getNowDate() | Returns the now date if possible in string representation. | Yiisoft\Requirements\RequirementsChecker |
| getResult() | Return the check results. | Yiisoft\Requirements\RequirementsChecker |
| getServerInfo() | Returns the server information. | Yiisoft\Requirements\RequirementsChecker |
| normalizeRequirement() | Normalizes requirement ensuring it has correct format. | Yiisoft\Requirements\RequirementsChecker |
| render() | Renders the requirements check result. | Yiisoft\Requirements\RequirementsChecker |
| renderViewFile() | Renders a view file. | Yiisoft\Requirements\RequirementsChecker |
| usageError() | Displays a usage error. | Yiisoft\Requirements\RequirementsChecker |
Property Details
Method Details
Check the given requirements, collecting results into internal field.
This method can be invoked several times checking different requirement sets. Use {@see \Yiisoft\Requirements\getResult()} or {@see \Yiisoft\Requirements\render()} to get the results.
| public $this check ( array|string $requirements ) | ||
| $requirements | array|string |
Requirements to be checked. If an array, it is treated as the set of requirements; If a string, it is treated as the path of the file, which contains the requirements; |
| return | $this |
Self instance. |
|---|---|---|
public function check($requirements): self
{
if (is_string($requirements)) {
/** @psalm-suppress UnresolvableInclude */
$requirements = require $requirements;
}
if (!is_array($requirements)) {
$this->usageError('Requirements must be an array, "' . gettype($requirements) . '" has been given!');
}
if (!isset($this->result)) {
$this->result = [
'summary' => [
'total' => 0,
'errors' => 0,
'warnings' => 0,
],
'requirements' => [],
];
}
foreach ($requirements as $key => $rawRequirement) {
if (!is_array($rawRequirement)) {
$this->usageError(
'Requirement must be an array, "' . gettype($rawRequirement) . '" has been given!'
);
}
$requirement = $this->normalizeRequirement($rawRequirement, $key);
$this->result['summary']['total']++;
if (!$requirement['condition']) {
if ($requirement['mandatory']) {
$requirement['error'] = true;
$requirement['warning'] = true;
$this->result['summary']['errors']++;
} else {
$requirement['error'] = false;
$requirement['warning'] = true;
$this->result['summary']['warnings']++;
}
} else {
$requirement['error'] = false;
$requirement['warning'] = false;
}
$this->result['requirements'][] = $requirement;
}
return $this;
}
Checks if the php.ini setting max_execution_time exceeds the execution time specified.
| public boolean checkMaxExecutionTime ( string|null $max = null ) | ||
| $max | string|null |
Maximum execution time. |
| return | boolean |
True on success. |
|---|---|---|
public function checkMaxExecutionTime(?string $max = null): bool
{
$maxExecutionTime = ini_get('max_exection_time');
return $max === null || $maxExecutionTime <= $max;
}
Checks if the given PHP extension is available and its version matches the given one.
| public boolean checkPhpExtensionVersion ( string $extensionName, string $version, string $compare = '>=' ) | ||
| $extensionName | string |
PHP extension name. |
| $version | string |
Required PHP extension version. |
| $compare | string |
Comparison operator, by default '>=' |
| return | boolean |
If PHP extension version matches. |
|---|---|---|
public function checkPhpExtensionVersion(string $extensionName, string $version, string $compare = '>='): bool
{
if (!extension_loaded($extensionName)) {
return false;
}
$extensionVersion = phpversion($extensionName);
if (empty($extensionVersion)) {
return false;
}
if (strncasecmp($extensionVersion, 'PECL-', 5) === 0) {
$extensionVersion = substr($extensionVersion, 5);
}
/** @var bool */
return version_compare($extensionVersion, $version, $compare);
}
Checks if PHP configuration option (from php.ini) is off.
| public boolean checkPhpIniOff ( string $name ) | ||
| $name | string |
Configuration option name. |
| return | boolean |
Whether option is off. |
|---|---|---|
public function checkPhpIniOff(string $name): bool
{
$value = ini_get($name);
if (empty($value)) {
return true;
}
return (strtolower($value) === 'off');
}
Checks if PHP configuration option (from php.ini) is on.
| public boolean checkPhpIniOn ( string $name ) | ||
| $name | string |
Configuration option name. |
| return | boolean |
Whether option is on. |
|---|---|---|
public function checkPhpIniOn(string $name): bool
{
$value = ini_get($name);
if (empty($value)) {
return false;
}
return ((int) $value === 1 || strtolower($value) === 'on');
}
Checks if upload max file size matches the given range.
| public boolean checkUploadMaxFileSize ( string|null $min = null, string|null $max = null ) | ||
| $min | string|null |
Verbose file size minimum required value, pass null to skip minimum check. |
| $max | string|null |
Verbose file size maximum required value, pass null to skip maximum check. |
| return | boolean |
True on success. |
|---|---|---|
public function checkUploadMaxFileSize(?string $min = null, ?string $max = null): bool
{
/**
* @var string $postMaxSize "post_max_size" option is existed, so `ini_get()` always returns a string.
*/
$postMaxSize = ini_get('post_max_size');
/**
* @var string $uploadMaxFileSize "upload_max_filesize" option is existed, so `ini_get()` always returns
* a string.
*/
$uploadMaxFileSize = ini_get('upload_max_filesize');
if ($min !== null) {
$minCheckResult = $this->compareByteSize($postMaxSize, $min, '>=') && $this->compareByteSize($uploadMaxFileSize, $min, '>=');
} else {
$minCheckResult = true;
}
if ($max !== null) {
$maxCheckResult = $this->compareByteSize($postMaxSize, $max, '<=') && $this->compareByteSize($uploadMaxFileSize, $max, '<=');
} else {
$maxCheckResult = true;
}
return ($minCheckResult && $maxCheckResult);
}
Compare byte sizes of values given in the verbose representation, like '5M', '15K' etc.
| public boolean compareByteSize ( string $a, string $b, string $compare = '>=' ) | ||
| $a | string |
First value. |
| $b | string |
Second value. |
| $compare | string |
Comparison operator, by default '>='. |
| return | boolean |
Comparison result. |
|---|---|---|
public function compareByteSize(string $a, string $b, string $compare = '>='): bool
{
$compareExpression = '(' . $this->getByteSize($a) . $compare . $this->getByteSize($b) . ')';
/** @var bool */
return $this->evaluateExpression($compareExpression);
}
Evaluates a PHP expression under the context of this class.
| public mixed evaluateExpression ( string $expression ) | ||
| $expression | string |
A PHP expression to be evaluated. |
| return | mixed |
The expression result. |
|---|---|---|
public function evaluateExpression(string $expression)
{
return eval('return ' . $expression . ';');
}
Gets the size in bytes from verbose size representation.
For example: '5K' => 5*1024
| public integer getByteSize ( string $verboseSize ) | ||
| $verboseSize | string |
Verbose size representation. |
| return | integer |
Actual size in bytes. |
|---|---|---|
public function getByteSize(string $verboseSize): int
{
if (empty($verboseSize)) {
return 0;
}
if (is_numeric($verboseSize)) {
return (int) $verboseSize;
}
$sizeUnit = trim($verboseSize, '0123456789');
$size = trim(str_replace($sizeUnit, '', $verboseSize));
if (!is_numeric($size)) {
return 0;
}
switch (strtolower($sizeUnit)) {
case 'kb':
case 'k':
return intval($size * 1024);
case 'mb':
case 'm':
return intval($size * 1024 * 1024);
case 'gb':
case 'g':
return intval($size * 1024 * 1024 * 1024);
default:
return 0;
}
}
Returns the now date if possible in string representation.
| public string getNowDate ( ) | ||
| return | string |
Now date. |
|---|---|---|
public function getNowDate(): string
{
return date('Y-m-d H:i:s');
}
Return the check results.
| public array|null getResult ( ) | ||
| return | array|null |
Check results in format:
|
|---|---|---|
public function getResult(): ?array
{
return $this->result ?? null;
}
Returns the server information.
| public string getServerInfo ( ) | ||
| return | string |
Server information. |
|---|---|---|
public function getServerInfo(): string
{
return $_SERVER['SERVER_SOFTWARE'] ?? '';
}
Normalizes requirement ensuring it has correct format.
| public array normalizeRequirement ( array $requirement, integer|string $requirementKey = 0 ) | ||
| $requirement | array |
Raw requirement. |
| $requirementKey | integer|string |
Requirement key in the list. |
| return | array |
Normalized requirement. |
|---|---|---|
public function normalizeRequirement(array $requirement, $requirementKey = 0): array
{
if (!array_key_exists('condition', $requirement)) {
$this->usageError("Requirement \"$requirementKey\" has no condition!");
} else {
$evalPrefix = 'eval:';
if (is_string($requirement['condition']) && strpos($requirement['condition'], $evalPrefix) === 0) {
$expression = substr($requirement['condition'], strlen($evalPrefix));
$requirement['condition'] = $this->evaluateExpression($expression);
}
}
if (!array_key_exists('name', $requirement)) {
$requirement['name'] = is_numeric($requirementKey) ? 'Requirement #' . $requirementKey : $requirementKey;
}
if (!array_key_exists('mandatory', $requirement)) {
if (array_key_exists('required', $requirement)) {
$requirement['mandatory'] = $requirement['required'];
} else {
$requirement['mandatory'] = false;
}
}
if (!array_key_exists('by', $requirement)) {
$requirement['by'] = 'Unknown';
}
if (!array_key_exists('memo', $requirement)) {
$requirement['memo'] = '';
}
return $requirement;
}
Renders the requirements check result.
The output will vary depending on if a script running from web or from console.
| public void render ( ) |
public function render(): void
{
if (!isset($this->result)) {
$this->usageError('Nothing to render!');
}
$baseViewFilePath = __DIR__ . DIRECTORY_SEPARATOR . 'views';
if (!empty($_SERVER['argv'])) {
$viewFileName = $baseViewFilePath . DIRECTORY_SEPARATOR . 'console' . DIRECTORY_SEPARATOR . 'index.php';
} else {
$viewFileName = $baseViewFilePath . DIRECTORY_SEPARATOR . 'web' . DIRECTORY_SEPARATOR . 'index.php';
}
$this->renderViewFile($viewFileName, $this->result);
}
Renders a view file.
This method includes the view file as a PHP script and captures the display result if required.
| public string renderViewFile ( string $_viewFile_, array|null $_data_ = null, boolean $_return_ = false ) | ||
| $_viewFile_ | string |
View file. |
| $_data_ | array|null |
Data to be extracted and made available to the view file. |
| $_return_ | boolean |
Whether the rendering result should be returned as a string. |
| return | string |
The rendering result. Null if the rendering result is not required. |
|---|---|---|
public function renderViewFile(string $_viewFile_, ?array $_data_ = null, bool $_return_ = false): ?string
{
// we use special variable names here to avoid conflict when extracting data
if (is_array($_data_)) {
extract($_data_, EXTR_PREFIX_SAME, 'data');
} else {
$data = $_data_;
}
if ($_return_) {
ob_start();
/**
* @psalm-suppress InvalidArgument Need for compatibility with PHP 7.4
*/
PHP_VERSION_ID >= 80000 ? ob_implicit_flush(false) : ob_implicit_flush(0);
/** @psalm-suppress UnresolvableInclude */
require $_viewFile_;
/**
* @var string In this case active output buffer is always existed, so `ob_get_clean()` returns a string.
*/
return ob_get_clean();
}
/** @psalm-suppress UnresolvableInclude */
require $_viewFile_;
return null;
}
Displays a usage error.
This method will then terminate the execution of the current application.
| public void usageError ( string $message ) | ||
| $message | string |
The error message |
public function usageError(string $message): void
{
echo "Error: $message\n\n";
exit(1);
}
Signup or Login in order to comment.