YiiRequirementChecker 类
继承关系 | YiiRequirementChecker |
---|---|
自版本可用 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/requirements/YiiRequirementChecker.php |
YiiRequirementChecker 允许检查当前系统是否满足运行 Yii 应用程序的要求。
此类允许为 Web 和控制台应用程序接口呈现检查报告。
示例
require_once 'path/to/YiiRequirementChecker.php';
$requirementsChecker = new YiiRequirementChecker();
$requirements = array(
array(
'name' => 'PHP Some Extension',
'mandatory' => true,
'condition' => extension_loaded('some_extension'),
'by' => 'Some application feature',
'memo' => 'PHP extension "some_extension" required',
),
);
$requirementsChecker->checkYii()->check($requirements)->render();
如果您希望使用自己的表示方式呈现报告,请使用 getResult() 而不是 render()
要求条件可以采用“eval:PHP 表达式”的格式。在这种情况下,指定的 PHP 表达式将在该类的实例上下文中进行评估。例如
$requirements = array(
array(
'name' => 'Upload max file size',
'condition' => 'eval:$this->checkUploadMaxFileSize("5M")',
),
);
注意:此类定义与普通的 Yii 样式不匹配,因为它应该与 PHP 4.3 匹配,并且不应使用来自较新 PHP 版本的功能!
公共方法
方法 | 描述 | 定义位置 |
---|---|---|
check() | 检查给定的要求,并将结果收集到内部字段中。 | YiiRequirementChecker |
checkPhpExtensionVersion() | 检查给定的 PHP 扩展是否可用,以及它的版本是否与给定的版本匹配。 | YiiRequirementChecker |
checkPhpIniOff() | 检查 PHP 配置选项(来自 php.ini)是否已关闭。 | YiiRequirementChecker |
checkPhpIniOn() | 检查 PHP 配置选项(来自 php.ini)是否已开启。 | YiiRequirementChecker |
checkUploadMaxFileSize() | 检查上传的最大文件大小是否与给定的范围匹配。 | YiiRequirementChecker |
checkYii() | 执行 Yii 核心要求的检查。 | YiiRequirementChecker |
compareByteSize() | 比较以冗长表示形式给出的值的字节大小,例如“5M”、“15K”等。 | YiiRequirementChecker |
evaluateExpression() | 在该类的上下文中评估 PHP 表达式。 | YiiRequirementChecker |
getByteSize() | 从冗长的大小表示中获取字节大小。 | YiiRequirementChecker |
getNowDate() | 如果可能,以字符串表示形式返回当前日期。 | YiiRequirementChecker |
getResult() | 返回检查结果。 | YiiRequirementChecker |
getServerInfo() | 返回服务器信息。 | YiiRequirementChecker |
normalizeRequirement() | 规范化要求,确保它具有正确的格式。 | YiiRequirementChecker |
render() | 呈现要求检查结果。 | YiiRequirementChecker |
renderViewFile() | 呈现视图文件。 | YiiRequirementChecker |
usageError() | 显示使用错误。 | YiiRequirementChecker |
属性详情
方法详情
检查给定的要求,并将结果收集到内部字段中。
此方法可以多次调用以检查不同的要求集。使用 getResult() 或 render() 获取结果。
public $this check ( $requirements ) | ||
$requirements | array|string |
要检查的要求。如果为数组,则将其视为要求集;如果为字符串,则将其视为包含要求的文件的路径; |
返回 | $this |
自身实例。 |
---|
function check($requirements)
{
if (is_string($requirements)) {
$requirements = require $requirements;
}
if (!is_array($requirements)) {
$this->usageError('Requirements must be an array, "' . gettype($requirements) . '" has been given!');
}
if (!isset($this->result) || !is_array($this->result)) {
$this->result = array(
'summary' => array(
'total' => 0,
'errors' => 0,
'warnings' => 0,
),
'requirements' => array(),
);
}
foreach ($requirements as $key => $rawRequirement) {
$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;
}
检查给定的 PHP 扩展是否可用,以及它的版本是否与给定的版本匹配。
public boolean checkPhpExtensionVersion ( $extensionName, $version, $compare = '>=' ) | ||
$extensionName | string |
PHP 扩展名称。 |
$version | string |
所需的 PHP 扩展版本。 |
$compare | string |
比较运算符,默认情况下为“>=” |
返回 | boolean |
如果 PHP 扩展版本匹配。 |
---|
function checkPhpExtensionVersion($extensionName, $version, $compare = '>=')
{
if (!extension_loaded($extensionName)) {
return false;
}
$extensionVersion = phpversion($extensionName);
if (empty($extensionVersion)) {
return false;
}
if (strncasecmp($extensionVersion, 'PECL-', 5) === 0) {
$extensionVersion = substr($extensionVersion, 5);
}
return version_compare($extensionVersion, $version, $compare);
}
检查 PHP 配置选项(来自 php.ini)是否已关闭。
public boolean checkPhpIniOff ( $name ) | ||
$name | string |
配置选项名称。 |
返回 | boolean |
选项已关闭。 |
---|
function checkPhpIniOff($name)
{
$value = ini_get($name);
if (empty($value)) {
return true;
}
return (strtolower($value) === 'off');
}
检查 PHP 配置选项(来自 php.ini)是否已开启。
public boolean checkPhpIniOn ( $name ) | ||
$name | string |
配置选项名称。 |
返回 | boolean |
选项已开启。 |
---|
function checkPhpIniOn($name)
{
$value = ini_get($name);
if (empty($value)) {
return false;
}
return ((int) $value === 1 || strtolower($value) === 'on');
}
检查上传的最大文件大小是否与给定的范围匹配。
public boolean checkUploadMaxFileSize ( $min = null, $max = null ) | ||
$min | string|null |
详细的文件大小最小值要求,传递 null 跳过最小值检查。 |
$max | string|null |
详细的文件大小最大值要求,传递 null 跳过最大值检查。 |
返回 | boolean |
成功。 |
---|
function checkUploadMaxFileSize($min = null, $max = null)
{
$postMaxSize = ini_get('post_max_size');
$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);
}
执行 Yii 核心要求的检查。
public YiiRequirementChecker checkYii ( ) | ||
返回 | YiiRequirementChecker |
自身实例。 |
---|
function checkYii()
{
return $this->check(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'requirements.php');
}
比较以冗长表示形式给出的值的字节大小,例如“5M”、“15K”等。
public boolean compareByteSize ( $a, $b, $compare = '>=' ) | ||
$a | string |
第一个值。 |
$b | string |
第二个值。 |
$compare | string |
比较运算符,默认值为'>='。 |
返回 | boolean |
比较结果。 |
---|
function compareByteSize($a, $b, $compare = '>=')
{
$compareExpression = '(' . $this->getByteSize($a) . $compare . $this->getByteSize($b) . ')';
return $this->evaluateExpression($compareExpression);
}
在该类的上下文中评估 PHP 表达式。
public mixed evaluateExpression ( $expression ) | ||
$expression | string |
要计算的 PHP 表达式。 |
返回 | mixed |
表达式结果。 |
---|
function evaluateExpression($expression)
{
return eval('return ' . $expression . ';');
}
从冗长的大小表示中获取字节大小。
例如:'5K' => 5*1024
public integer getByteSize ( $verboseSize ) | ||
$verboseSize | string |
详细的大小表示。 |
返回 | integer |
实际大小(以字节为单位)。 |
---|
function getByteSize($verboseSize)
{
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 $size * 1024;
case 'mb':
case 'm':
return $size * 1024 * 1024;
case 'gb':
case 'g':
return $size * 1024 * 1024 * 1024;
default:
return 0;
}
}
如果可能,以字符串表示形式返回当前日期。
public string getNowDate ( ) | ||
返回 | string |
当前日期。 |
---|
function getNowDate()
{
return @strftime('%Y-%m-%d %H:%M', time());
}
返回检查结果。
public array|null getResult ( ) | ||
返回 | array|null |
检查结果格式
|
---|
function getResult()
{
if (isset($this->result)) {
return $this->result;
} else {
return null;
}
}
返回服务器信息。
public string getServerInfo ( ) | ||
返回 | string |
服务器信息。 |
---|
function getServerInfo()
{
return isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';
}
规范化要求,确保它具有正确的格式。
public array normalizeRequirement ( $requirement, $requirementKey = 0 ) | ||
$requirement | array |
原始要求。 |
$requirementKey | integer |
列表中的要求键。 |
返回 | array |
标准化的要求。 |
---|
function normalizeRequirement($requirement, $requirementKey = 0)
{
if (!is_array($requirement)) {
$this->usageError('Requirement must be an 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;
}
呈现要求检查结果。
输出将根据脚本是从 Web 还是从控制台运行而有所不同。
public void render ( ) |
function render()
{
if (!isset($this->result)) {
$this->usageError('Nothing to render!');
}
$baseViewFilePath = dirname(__FILE__) . 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);
}
呈现视图文件。
此方法将视图文件包含为 PHP 脚本,并在需要时捕获显示结果。
public string|null renderViewFile ( $_viewFile_, $_data_ = null, $_return_ = false ) | ||
$_viewFile_ | string |
视图文件 |
$_data_ | array|null |
要提取并提供给视图文件的数据 |
$_return_ | boolean |
是否应将渲染结果作为字符串返回 |
返回 | string|null |
渲染结果。如果不需要渲染结果,则为 null。 |
---|
function renderViewFile($_viewFile_, $_data_ = null, $_return_ = false)
{
// 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();
ob_implicit_flush(false);
require $_viewFile_;
return ob_get_clean();
} else {
require $_viewFile_;
}
}
显示使用错误。
此方法将终止当前应用程序的执行。
public void usageError ( $message ) | ||
$message | string |
错误消息 |
function usageError($message)
{
echo "Error: $message\n\n";
exit(1);
}
注册 或 登录 以发表评论。