0 追蹤者

類別 YiiRequirementChecker

繼承YiiRequirementChecker
起始版本2.0
原始碼 https://github.com/yiisoft/yii2/blob/master/framework/requirements/YiiRequirementChecker.php

YiiRequirementChecker 允許檢查目前系統是否符合執行 Yii 應用程式的需求。

這個類別允許為網頁和主控台應用程式介面呈現檢查報告。

範例

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 版本的功能!

公開屬性

隱藏繼承的屬性

屬性 類型 描述 定義於
$result \Check 結果 YiiRequirementChecker

公開方法

隱藏繼承的方法

方法 描述 定義於
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

屬性詳細資訊

隱藏繼承的屬性

$result public property

結果

public \Check $result null

方法詳細資訊

隱藏繼承的方法

check() public method

檢查給定的需求,將結果收集到內部欄位中。

此方法可以被多次調用,以檢查不同的需求集。 使用 getResult()render() 來取得結果。

public $this check ( $requirements )
$requirements array|string

要檢查的需求。如果是陣列,則視為需求集合;如果是字串,則視為包含需求檔案的路徑;

return $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;
}

            
checkPhpExtensionVersion() public 方法

檢查給定的 PHP 擴展是否可用,以及其版本是否與給定的版本相符。

public boolean checkPhpExtensionVersion ( $extensionName, $version, $compare '>=' )
$extensionName string

PHP 擴充套件名稱。

$version string

需要的 PHP 擴充套件版本。

$compare string

比較運算子,預設為 '>='

return 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);
}

            
checkPhpIniOff() public 方法

檢查 PHP 配置選項 (來自 php.ini) 是否為關閉。

public boolean checkPhpIniOff ( $name )
$name string

組態選項名稱。

return boolean

選項為關閉。

                function checkPhpIniOff($name)
{
    $value = ini_get($name);
    if (empty($value)) {
        return true;
    }
    return (strtolower($value) === 'off');
}

            
checkPhpIniOn() public 方法

檢查 PHP 配置選項 (來自 php.ini) 是否為開啟。

public boolean checkPhpIniOn ( $name )
$name string

組態選項名稱。

return boolean

選項為開啟。

                function checkPhpIniOn($name)
{
    $value = ini_get($name);
    if (empty($value)) {
        return false;
    }
    return ((int) $value === 1 || strtolower($value) === 'on');
}

            
checkUploadMaxFileSize() public 方法

檢查上傳最大檔案大小是否符合給定的範圍。

public boolean checkUploadMaxFileSize ( $min null, $max null )
$min string|null

詳細檔案大小最小值,傳遞 null 以跳過最小值檢查。

$max string|null

詳細檔案大小最大值,傳遞 null 以跳過最大值檢查。

return 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);
}

            
checkYii() public 方法

執行 Yii 核心需求的檢查。

public YiiRequirementChecker checkYii ( )
return YiiRequirementChecker

自身實例。

                function checkYii()
{
    return $this->check(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'requirements.php');
}

            
compareByteSize() public 方法

比較以詳細表示形式給出的值的位元組大小,例如 '5M'、'15K' 等。

public boolean compareByteSize ( $a, $b, $compare '>=' )
$a string

第一個值。

$b string

第二個值。

$compare string

比較運算子,預設為 '>='。

return boolean

比較結果。

                function compareByteSize($a, $b, $compare = '>=')
{
    $compareExpression = '(' . $this->getByteSize($a) . $compare . $this->getByteSize($b) . ')';
    return $this->evaluateExpression($compareExpression);
}

            
evaluateExpression() public 方法

在此類別的上下文中評估 PHP 表達式。

public mixed evaluateExpression ( $expression )
$expression string

要評估的 PHP 表達式。

return mixed

表達式結果。

                function evaluateExpression($expression)
{
    return eval('return ' . $expression . ';');
}

            
getByteSize() public 方法

從詳細的大小表示形式中取得以位元組為單位的大小。

例如:'5K' => 5*1024

public integer getByteSize ( $verboseSize )
$verboseSize string

詳細的大小表示。

return 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;
    }
}

            
getNowDate() public 方法

如果可能,以字串表示形式傳回現在日期。

public string getNowDate ( )
return string

現在日期。

                function getNowDate()
{
    return @strftime('%Y-%m-%d %H:%M', time());
}

            
getResult() public 方法

傳回檢查結果。

public array|null getResult ( )
return array|null

檢查結果格式

array(
    'summary' => array(
        'total' => total number of checks,
        'errors' => number of errors,
        'warnings' => number of warnings,
    ),
    'requirements' => array(
        array(
            ...
            'error' => is there an error,
            'warning' => is there a warning,
        ),
        ...
    ),
)

                function getResult()
{
    if (isset($this->result)) {
        return $this->result;
    } else {
        return null;
    }
}

            
getServerInfo() public 方法

傳回伺服器資訊。

public string getServerInfo ( )
return string

伺服器資訊。

                function getServerInfo()
{
    return isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';
}

            
normalizeRequirement() public 方法

標準化需求,確保其格式正確。

public array normalizeRequirement ( $requirement, $requirementKey 0 )
$requirement array

原始需求。

$requirementKey integer

列表中的需求鍵。

return 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;
}

            
render() public 方法

呈現需求檢查結果。

輸出會根據腳本是從網頁或控制台執行而有所不同。

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);
}

            
renderViewFile() public 方法

呈現檢視檔案。

此方法會將視圖檔案作為 PHP 腳本引入,並在需要時捕獲顯示結果。

public string|null renderViewFile ( $_viewFile_, $_data_ null, $_return_ false )
$_viewFile_ string

視圖檔案

$_data_ array|null

要提取並提供給視圖檔案的資料

$_return_ boolean

是否應將呈現結果作為字串傳回

return 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_;
    }
}

            
usageError() public 方法

顯示使用錯誤。

此方法將會終止目前應用程式的執行。

public void usageError ( $message )
$message string

錯誤訊息

                function usageError($message)
{
    echo "Error: $message\n\n";
    exit(1);
}