クラス 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 バージョンの機能を使用できないためです!
公開メソッド
プロパティの詳細
メソッドの詳細
指定された要件をチェックし、結果を内部フィールドに収集します。
このメソッドは、異なる要件セットをチェックするために複数回呼び出すことができます。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 |
2番目の値。 |
$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;
}
要件チェックの結果をレンダリングします。
出力は、スクリプトがウェブから実行されるかコンソールから実行されるかによって異なります。
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);
}
コメントするにはサインアップまたはログインしてください。