類別 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 版本的功能!
公開方法
方法 | 描述 | 定義於 |
---|---|---|
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 |
要檢查的需求。如果是陣列,則視為需求集合;如果是字串,則視為包含需求檔案的路徑; |
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;
}
檢查給定的 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);
}
檢查 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');
}
檢查 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');
}
檢查上傳最大檔案大小是否符合給定的範圍。
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);
}
執行 Yii 核心需求的檢查。
public YiiRequirementChecker checkYii ( ) | ||
return | 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 |
比較運算子,預設為 '>='。 |
return | 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 表達式。 |
return | mixed |
表達式結果。 |
---|
function evaluateExpression($expression)
{
return eval('return ' . $expression . ';');
}
從詳細的大小表示形式中取得以位元組為單位的大小。
例如:'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;
}
}
如果可能,以字串表示形式傳回現在日期。
public string getNowDate ( ) | ||
return | string |
現在日期。 |
---|
function getNowDate()
{
return @strftime('%Y-%m-%d %H:%M', time());
}
傳回檢查結果。
public array|null getResult ( ) | ||
return | array|null |
檢查結果格式
|
---|
function getResult()
{
if (isset($this->result)) {
return $this->result;
} else {
return null;
}
}
傳回伺服器資訊。
public string getServerInfo ( ) | ||
return | string |
伺服器資訊。 |
---|
function getServerInfo()
{
return isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';
}
標準化需求,確保其格式正確。
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;
}
呈現需求檢查結果。
輸出會根據腳本是從網頁或控制台執行而有所不同。
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 |
是否應將呈現結果作為字串傳回 |
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_;
}
}
顯示使用錯誤。
此方法將會終止目前應用程式的執行。
public void usageError ( $message ) | ||
$message | string |
錯誤訊息 |
function usageError($message)
{
echo "Error: $message\n\n";
exit(1);
}
註冊 或 登入 以發表評論。