Browse Source
* master: (33 commits) Skipped ApcCacheTest expire MS Windows EOLs → UNIX EOLs. Build command path fix. refactored RBAC. Added usage example of Theme. Added default class for theme. Fixes issue #172: Implemented new usage of widgets. code style fix of YiiRequirementChecker.php Renamed yiirequirements.php to requirements.php "YiiRequirementChecker" console view has been reworked to display requirements by blocks and in brief for the successful ones. Changed framework in dir structure to yii requirements.php typo fix. "requirements.php" has been added to "bootstrap" application. Doc comments and error messages for "YiiRequirementChecker" have been adjusted. Doc comments for "YiiRequirementChecker" have been updated. PHP version fallback for "YiiRequirementChecker" has been added. "YiiRequirementChecker::check()" has been updated allowing to accept filename for the requirements. Yii core requirements file has been composed. Check helper methods have been added to "YiiRequirementChecker". Web view for "YiiRequirementChecker" has been created. "YiiRequirementChecker::render()" has been implemented, console view has been created. added newline to end of header and body blocks in View ...tags/2.0.0-beta
Antonio Ramirez
12 years ago
45 changed files with 1454 additions and 461 deletions
@ -0,0 +1,96 @@
|
||||
<?php |
||||
/** |
||||
* Application requirement checker script. |
||||
* |
||||
* In order to run this script use the following console command: |
||||
* php requirements.php |
||||
* |
||||
* In order to run this script from the web, you should copy it to the web root. |
||||
* If you are using Linux you can create a hard link instead, using the following command: |
||||
* ln requirements.php ../requirements.php |
||||
*/ |
||||
|
||||
// you may need to adjust this path to the correct Yii framework path |
||||
$frameworkPath = dirname(__FILE__) . '/../../../yii'; |
||||
|
||||
require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
/** |
||||
* Adjust requirements according to your application specifics. |
||||
*/ |
||||
$requirements = array( |
||||
// Database : |
||||
array( |
||||
'name' => 'PDO extension', |
||||
'mandatory' => true, |
||||
'condition' => extension_loaded('pdo'), |
||||
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', |
||||
), |
||||
array( |
||||
'name' => 'PDO SQLite extension', |
||||
'mandatory' => false, |
||||
'condition' => extension_loaded('pdo_sqlite'), |
||||
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', |
||||
'memo' => 'Required for SQLite database.', |
||||
), |
||||
array( |
||||
'name' => 'PDO MySQL extension', |
||||
'mandatory' => false, |
||||
'condition' => extension_loaded('pdo_mysql'), |
||||
'by' => 'All <a href="http://www.yiiframework.com/doc/api/#system.db">DB-related classes</a>', |
||||
'memo' => 'Required for MySQL database.', |
||||
), |
||||
// Cache : |
||||
array( |
||||
'name' => 'Memcache extension', |
||||
'mandatory' => false, |
||||
'condition' => extension_loaded('memcache') || extension_loaded('memcached'), |
||||
'by' => '<a href="http://www.yiiframework.com/doc/api/CMemCache">CMemCache</a>', |
||||
'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc/api/CMemCache#useMemcached-detail">CMemCache::useMemcached</a> to <code>true</code>.' : '' |
||||
), |
||||
array( |
||||
'name' => 'APC extension', |
||||
'mandatory' => false, |
||||
'condition' => extension_loaded('apc') || extension_loaded('apc'), |
||||
'by' => '<a href="http://www.yiiframework.com/doc/api/CApcCache">CApcCache</a>', |
||||
), |
||||
// Additional PHP extensions : |
||||
array( |
||||
'name' => 'Mcrypt extension', |
||||
'mandatory' => false, |
||||
'condition' => extension_loaded('mcrypt'), |
||||
'by' => '<a href="http://www.yiiframework.com/doc/api/CSecurityManager">CSecurityManager</a>', |
||||
'memo' => 'Required by encrypt and decrypt methods.' |
||||
), |
||||
// PHP ini : |
||||
'phpSafeMode' => array( |
||||
'name' => 'PHP safe mode', |
||||
'mandatory' => false, |
||||
'condition' => $requirementsChecker->checkPhpIniOff("safe_mode"), |
||||
'by' => 'File uploading and console command execution', |
||||
'memo' => '"safe_mode" should be disabled at php.ini', |
||||
), |
||||
'phpExposePhp' => array( |
||||
'name' => 'Expose PHP', |
||||
'mandatory' => false, |
||||
'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), |
||||
'by' => 'Security reasons', |
||||
'memo' => '"expose_php" should be disabled at php.ini', |
||||
), |
||||
'phpAllowUrlInclude' => array( |
||||
'name' => 'PHP allow url include', |
||||
'mandatory' => false, |
||||
'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), |
||||
'by' => 'Security reasons', |
||||
'memo' => '"allow_url_include" should be disabled at php.ini', |
||||
), |
||||
'phpSmtp' => array( |
||||
'name' => 'PHP mail SMTP', |
||||
'mandatory' => false, |
||||
'condition' => strlen(ini_get('SMTP'))>0, |
||||
'by' => 'Email sending', |
||||
'memo' => 'PHP mail SMTP server required', |
||||
), |
||||
); |
||||
$requirementsChecker->checkYii()->check($requirements)->render(); |
@ -0,0 +1,195 @@
|
||||
<?php |
||||
|
||||
require_once(realpath(__DIR__.'/../../../../yii/requirements/YiiRequirementChecker.php')); |
||||
|
||||
use yiiunit\TestCase; |
||||
|
||||
/** |
||||
* Test case for [[YiiRequirementChecker]]. |
||||
* @see YiiRequirementChecker |
||||
*/ |
||||
class YiiRequirementCheckerTest extends TestCase |
||||
{ |
||||
public function testCheck() |
||||
{ |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
$requirements = array( |
||||
'requirementPass' => array( |
||||
'name' => 'Requirement 1', |
||||
'mandatory' => true, |
||||
'condition' => true, |
||||
'by' => 'Requirement 1', |
||||
'memo' => 'Requirement 1', |
||||
), |
||||
'requirementError' => array( |
||||
'name' => 'Requirement 2', |
||||
'mandatory' => true, |
||||
'condition' => false, |
||||
'by' => 'Requirement 2', |
||||
'memo' => 'Requirement 2', |
||||
), |
||||
'requirementWarning' => array( |
||||
'name' => 'Requirement 3', |
||||
'mandatory' => false, |
||||
'condition' => false, |
||||
'by' => 'Requirement 3', |
||||
'memo' => 'Requirement 3', |
||||
), |
||||
); |
||||
|
||||
$checkResult = $requirementsChecker->check($requirements)->getResult(); |
||||
$summary = $checkResult['summary']; |
||||
|
||||
$this->assertEquals(count($requirements), $summary['total'], 'Wrong summary total!'); |
||||
$this->assertEquals(1, $summary['errors'], 'Wrong summary errors!'); |
||||
$this->assertEquals(1, $summary['warnings'], 'Wrong summary warnings!'); |
||||
|
||||
$checkedRequirements = $checkResult['requirements']; |
||||
$requirementsKeys = array_flip(array_keys($requirements)); |
||||
|
||||
$this->assertEquals(false, $checkedRequirements[$requirementsKeys['requirementPass']]['error'], 'Passed requirement has an error!'); |
||||
$this->assertEquals(false, $checkedRequirements[$requirementsKeys['requirementPass']]['warning'], 'Passed requirement has a warning!'); |
||||
|
||||
$this->assertEquals(true, $checkedRequirements[$requirementsKeys['requirementError']]['error'], 'Error requirement has no error!'); |
||||
|
||||
$this->assertEquals(false, $checkedRequirements[$requirementsKeys['requirementWarning']]['error'], 'Error requirement has an error!'); |
||||
$this->assertEquals(true, $checkedRequirements[$requirementsKeys['requirementWarning']]['warning'], 'Error requirement has no warning!'); |
||||
} |
||||
|
||||
/** |
||||
* @depends testCheck |
||||
*/ |
||||
public function testCheckEval() { |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
$requirements = array( |
||||
'requirementPass' => array( |
||||
'name' => 'Requirement 1', |
||||
'mandatory' => true, |
||||
'condition' => 'eval:2>1', |
||||
'by' => 'Requirement 1', |
||||
'memo' => 'Requirement 1', |
||||
), |
||||
'requirementError' => array( |
||||
'name' => 'Requirement 2', |
||||
'mandatory' => true, |
||||
'condition' => 'eval:2<1', |
||||
'by' => 'Requirement 2', |
||||
'memo' => 'Requirement 2', |
||||
), |
||||
); |
||||
|
||||
$checkResult = $requirementsChecker->check($requirements)->getResult(); |
||||
$checkedRequirements = $checkResult['requirements']; |
||||
$requirementsKeys = array_flip(array_keys($requirements)); |
||||
|
||||
$this->assertEquals(false, $checkedRequirements[$requirementsKeys['requirementPass']]['error'], 'Passed requirement has an error!'); |
||||
$this->assertEquals(false, $checkedRequirements[$requirementsKeys['requirementPass']]['warning'], 'Passed requirement has a warning!'); |
||||
|
||||
$this->assertEquals(true, $checkedRequirements[$requirementsKeys['requirementError']]['error'], 'Error requirement has no error!'); |
||||
} |
||||
|
||||
/** |
||||
* @depends testCheck |
||||
*/ |
||||
public function testCheckChained() |
||||
{ |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
$requirements1 = array( |
||||
array( |
||||
'name' => 'Requirement 1', |
||||
'mandatory' => true, |
||||
'condition' => true, |
||||
'by' => 'Requirement 1', |
||||
'memo' => 'Requirement 1', |
||||
), |
||||
); |
||||
$requirements2 = array( |
||||
array( |
||||
'name' => 'Requirement 2', |
||||
'mandatory' => true, |
||||
'condition' => true, |
||||
'by' => 'Requirement 2', |
||||
'memo' => 'Requirement 2', |
||||
), |
||||
); |
||||
$checkResult = $requirementsChecker->check($requirements1)->check($requirements2)->getResult(); |
||||
|
||||
$mergedRequirements = array_merge($requirements1, $requirements2); |
||||
|
||||
$this->assertEquals(count($mergedRequirements), $checkResult['summary']['total'], 'Wrong total checks count!'); |
||||
foreach ($mergedRequirements as $key => $mergedRequirement) { |
||||
$this->assertEquals($mergedRequirement['name'], $checkResult['requirements'][$key]['name'], 'Wrong requirements list!'); |
||||
} |
||||
} |
||||
|
||||
public function testCheckPhpExtensionVersion() |
||||
{ |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
$this->assertFalse($requirementsChecker->checkPhpExtensionVersion('some_unexisting_php_extension', '0.1'), 'No fail while checking unexisting extension!'); |
||||
$this->assertTrue($requirementsChecker->checkPhpExtensionVersion('pdo', '1.0'), 'Unable to check PDO version!'); |
||||
} |
||||
|
||||
/** |
||||
* Data provider for [[testGetByteSize()]]. |
||||
* @return array |
||||
*/ |
||||
public function dataProviderGetByteSize() |
||||
{ |
||||
return array( |
||||
array('456', 456), |
||||
array('5K', 5*1024), |
||||
array('16KB', 16*1024), |
||||
array('4M', 4*1024*1024), |
||||
array('14MB', 14*1024*1024), |
||||
array('7G', 7*1024*1024*1024), |
||||
array('12GB', 12*1024*1024*1024), |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider dataProviderGetByteSize |
||||
* |
||||
* @param string $verboseValue verbose value. |
||||
* @param integer $expectedByteSize expected byte size. |
||||
*/ |
||||
public function testGetByteSize($verboseValue, $expectedByteSize) |
||||
{ |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
|
||||
$this->assertEquals($expectedByteSize, $requirementsChecker->getByteSize($verboseValue), "Wrong byte size for '{$verboseValue}'!"); |
||||
} |
||||
|
||||
/** |
||||
* Data provider for [[testCompareByteSize()]] |
||||
* @return array |
||||
*/ |
||||
public function dataProviderCompareByteSize() |
||||
{ |
||||
return array( |
||||
array('2M', '2K', '>', true), |
||||
array('2M', '2K', '>=', true), |
||||
array('1K', '1024', '==', true), |
||||
array('10M', '11M', '<', true), |
||||
array('10M', '11M', '<=', true), |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* @depends testGetByteSize |
||||
* @dataProvider dataProviderCompareByteSize |
||||
* |
||||
* @param string $a first value. |
||||
* @param string $b second value. |
||||
* @param string $compare comparison. |
||||
* @param boolean $expectedComparisonResult expected comparison result. |
||||
*/ |
||||
public function testCompareByteSize($a, $b, $compare, $expectedComparisonResult) |
||||
{ |
||||
$requirementsChecker = new YiiRequirementChecker(); |
||||
$this->assertEquals($expectedComparisonResult, $requirementsChecker->compareByteSize($a, $b, $compare), "Wrong compare '{$a}{$compare}{$b}'"); |
||||
} |
||||
} |
@ -0,0 +1,392 @@
|
||||
<?php |
||||
/** |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright (c) 2008 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
if (version_compare(PHP_VERSION, '4.3', '<')) { |
||||
echo 'At least PHP 4.3 is required to run this script!'; |
||||
exit(1); |
||||
} |
||||
|
||||
/** |
||||
* YiiRequirementChecker 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: |
||||
* |
||||
* ~~~ |
||||
* 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(); |
||||
* ~~~ |
||||
* |
||||
* If you wish to render the report with your own representation, use [[getResult()]] instead of [[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 = array( |
||||
* array( |
||||
* 'name' => 'Upload max file size', |
||||
* 'condition' => 'eval:$this->checkUploadMaxFileSize("5M")', |
||||
* ), |
||||
* ); |
||||
* ~~~ |
||||
* |
||||
* @property array|null $result the check results, this property is for internal usage only. |
||||
* |
||||
* @author Paul Klimov <klimov.paul@gmail.com> |
||||
* @since 2.0 |
||||
*/ |
||||
class YiiRequirementChecker |
||||
{ |
||||
/** |
||||
* Check the given requirements, collecting results into internal field. |
||||
* This method can be invoked several times checking different requirement sets. |
||||
* Use [[getResult()]] or [[render()]] to get the results. |
||||
* @param array|string $requirements 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 YiiRequirementChecker self instance. |
||||
*/ |
||||
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; |
||||
} |
||||
|
||||
/** |
||||
* Performs the check for the Yii core requirements. |
||||
* @return YiiRequirementChecker self instance. |
||||
*/ |
||||
public function checkYii() |
||||
{ |
||||
return $this->check(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'requirements.php'); |
||||
} |
||||
|
||||
/** |
||||
* Return the check results. |
||||
* @return array|null check results in format: |
||||
* <code> |
||||
* 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, |
||||
* ), |
||||
* ... |
||||
* ), |
||||
* ) |
||||
* </code> |
||||
*/ |
||||
function getResult() |
||||
{ |
||||
if (isset($this->result)) { |
||||
return $this->result; |
||||
} else { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Renders the requirements check result. |
||||
* The output will vary depending is a script running from web or from console. |
||||
*/ |
||||
function render() |
||||
{ |
||||
if (!isset($this->result)) { |
||||
$this->usageError('Nothing to render!'); |
||||
} |
||||
$baseViewFilePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'views'; |
||||
if (array_key_exists('argv', $_SERVER)) { |
||||
$viewFileName = $baseViewFilePath . DIRECTORY_SEPARATOR . 'console' . DIRECTORY_SEPARATOR . 'index.php'; |
||||
} else { |
||||
$viewFileName = $baseViewFilePath . DIRECTORY_SEPARATOR . 'web' . DIRECTORY_SEPARATOR . 'index.php'; |
||||
} |
||||
$this->renderViewFile($viewFileName, $this->result); |
||||
} |
||||
|
||||
/** |
||||
* Checks if the given PHP extension is available and its version matches the given one. |
||||
* @param string $extensionName PHP extension name. |
||||
* @param string $version required PHP extension version. |
||||
* @param string $compare comparison operator, by default '>=' |
||||
* @return boolean if PHP extension version matches. |
||||
*/ |
||||
function checkPhpExtensionVersion($extensionName, $version, $compare = '>=') |
||||
{ |
||||
if (!extension_loaded($extensionName)) { |
||||
return false; |
||||
} |
||||
$extensionVersion = phpversion($extensionName); |
||||
if (empty($extensionVersion)) { |
||||
return false; |
||||
} |
||||
return version_compare($extensionVersion, $version, $compare); |
||||
} |
||||
|
||||
/** |
||||
* Checks if PHP configuration option (from php.ini) is on. |
||||
* @param string $name configuration option name. |
||||
* @return boolean option is on. |
||||
*/ |
||||
function checkPhpIniOn($name) |
||||
{ |
||||
$value = ini_get($name); |
||||
if (empty($value)) { |
||||
return false; |
||||
} |
||||
return ((integer)$value == 1 || strtolower($value) == 'on'); |
||||
} |
||||
|
||||
/** |
||||
* Checks if PHP configuration option (from php.ini) is off. |
||||
* @param string $name configuration option name. |
||||
* @return boolean option is off. |
||||
*/ |
||||
function checkPhpIniOff($name) |
||||
{ |
||||
$value = ini_get($name); |
||||
if (empty($value)) { |
||||
return true; |
||||
} |
||||
return (strtolower($value) == 'off'); |
||||
} |
||||
|
||||
/** |
||||
* Compare byte sizes of values given in the verbose representation, |
||||
* like '5M', '15K' etc. |
||||
* @param string $a first value. |
||||
* @param string $b second value. |
||||
* @param string $compare comparison operator, by default '>='. |
||||
* @return boolean comparison result. |
||||
*/ |
||||
function compareByteSize($a, $b, $compare = '>=') |
||||
{ |
||||
$compareExpression = '(' . $this->getByteSize($a) . $compare . $this->getByteSize($b) . ')'; |
||||
return $this->evaluateExpression($compareExpression); |
||||
} |
||||
|
||||
/** |
||||
* Gets the size in bytes from verbose size representation. |
||||
* For example: '5K' => 5*1024 |
||||
* @param string $verboseSize verbose size representation. |
||||
* @return integer actual size in bytes. |
||||
*/ |
||||
function getByteSize($verboseSize) |
||||
{ |
||||
if (empty($verboseSize)) { |
||||
return 0; |
||||
} |
||||
if (is_numeric($verboseSize)) { |
||||
return (integer)$verboseSize; |
||||
} |
||||
$sizeUnit = trim($verboseSize, '0123456789'); |
||||
$size = str_replace($sizeUnit, '', $verboseSize); |
||||
$size = trim($size); |
||||
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; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Checks if upload max file size matches the given range. |
||||
* @param string|null $min verbose file size minimum required value, pass null to skip minimum check. |
||||
* @param string|null $max verbose file size maximum required value, pass null to skip maximum check. |
||||
* @return boolean success. |
||||
*/ |
||||
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) { |
||||
var_dump($postMaxSize, $uploadMaxFileSize, $max); |
||||
$maxCheckResult = $this->compareByteSize($postMaxSize, $max, '<=') && $this->compareByteSize($uploadMaxFileSize, $max, '<='); |
||||
} else { |
||||
$maxCheckResult = true; |
||||
} |
||||
return ($minCheckResult && $maxCheckResult); |
||||
} |
||||
|
||||
/** |
||||
* Renders a view file. |
||||
* This method includes the view file as a PHP script |
||||
* and captures the display result if required. |
||||
* @param string $_viewFile_ view file |
||||
* @param array $_data_ data to be extracted and made available to the view file |
||||
* @param boolean $_return_ whether the rendering result should be returned as a string |
||||
* @return string the rendering result. Null if the rendering result is not required. |
||||
*/ |
||||
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_); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Normalizes requirement ensuring it has correct format. |
||||
* @param array $requirement raw requirement. |
||||
* @param int $requirementKey requirement key in the list. |
||||
* @return array normalized requirement. |
||||
*/ |
||||
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; |
||||
} |
||||
|
||||
/** |
||||
* Displays a usage error. |
||||
* This method will then terminate the execution of the current application. |
||||
* @param string $message the error message |
||||
*/ |
||||
function usageError($message) |
||||
{ |
||||
echo "Error: $message\n\n"; |
||||
exit(1); |
||||
} |
||||
|
||||
/** |
||||
* Evaluates a PHP expression under the context of this class. |
||||
* @param string $expression a PHP expression to be evaluated. |
||||
* @return mixed the expression result. |
||||
*/ |
||||
function evaluateExpression($expression) |
||||
{ |
||||
return eval('return ' . $expression . ';'); |
||||
} |
||||
|
||||
/** |
||||
* Returns the server information. |
||||
* @return string server information. |
||||
*/ |
||||
function getServerInfo() |
||||
{ |
||||
$info = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; |
||||
return $info; |
||||
} |
||||
|
||||
/** |
||||
* Returns the now date if possible in string representation. |
||||
* @return string now date. |
||||
*/ |
||||
function getNowDate() |
||||
{ |
||||
$nowDate = @strftime('%Y-%m-%d %H:%M', time()); |
||||
return $nowDate; |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
<?php |
||||
/** |
||||
* This is the Yii core requirements for the [[YiiRequirementChecker]] instance. |
||||
* These requirements are mandatory for any Yii application. |
||||
*/ |
||||
return array( |
||||
array( |
||||
'name' => 'PHP version', |
||||
'mandatory' => true, |
||||
'condition' => version_compare(PHP_VERSION, '5.3.0', '>='), |
||||
'by' => '<a href="http://www.yiiframework.com">Yii Framework</a>', |
||||
'memo' => 'PHP 5.3.0 or higher is required.', |
||||
), |
||||
array( |
||||
'name' => 'Reflection extension', |
||||
'mandatory' => true, |
||||
'condition' => class_exists('Reflection', false), |
||||
'by' => '<a href="http://www.yiiframework.com">Yii Framework</a>', |
||||
), |
||||
array( |
||||
'name' => 'PCRE extension', |
||||
'mandatory' => true, |
||||
'condition' => extension_loaded('pcre'), |
||||
'by' => '<a href="http://www.yiiframework.com">Yii Framework</a>', |
||||
), |
||||
array( |
||||
'name' => 'SPL extension', |
||||
'mandatory' => true, |
||||
'condition' => extension_loaded('SPL'), |
||||
'by' => '<a href="http://www.yiiframework.com">Yii Framework</a>', |
||||
), |
||||
array( |
||||
'name' => 'MBString extension', |
||||
'mandatory' => true, |
||||
'condition' => extension_loaded('mbstring'), |
||||
'by' => '<a href="http://www.php.net/manual/en/book.mbstring.php">Multibyte string</a> processing', |
||||
'memo' => 'Required for multibyte encoding string processing.' |
||||
), |
||||
); |
@ -0,0 +1,36 @@
|
||||
<?php |
||||
/* @var $this YiiRequirementChecker */ |
||||
/* @var $summary array */ |
||||
/* @var $requirements array[] */ |
||||
|
||||
echo "\nYii Application Requirement Checker\n\n"; |
||||
|
||||
echo "This script checks if your server configuration meets the requirements\n"; |
||||
echo "for running Yii application.\n"; |
||||
echo "It checks if the server is running the right version of PHP,\n"; |
||||
echo "if appropriate PHP extensions have been loaded, and if php.ini file settings are correct.\n"; |
||||
|
||||
$header = 'Check conclusion:'; |
||||
echo "\n{$header}\n"; |
||||
echo str_pad('', strlen($header), '-')."\n\n"; |
||||
|
||||
foreach ($requirements as $key => $requirement) { |
||||
if ($requirement['condition']) { |
||||
echo $requirement['name'].": OK\n"; |
||||
echo "\n"; |
||||
} else { |
||||
echo $requirement['name'].': '.($requirement['mandatory'] ? 'FAILED!!!' : 'WARNING!!!')."\n"; |
||||
echo 'Required by: '.strip_tags($requirement['by'])."\n"; |
||||
$memo = strip_tags($requirement['memo']); |
||||
if (!empty($memo)) { |
||||
echo 'Memo: '.strip_tags($requirement['memo'])."\n"; |
||||
} |
||||
echo "\n"; |
||||
} |
||||
} |
||||
|
||||
$summaryString = 'Errors: '.$summary['errors'].' Warnings: '.$summary['warnings'].' Total checks: '.$summary['total']; |
||||
echo str_pad('', strlen($summaryString), '-')."\n"; |
||||
echo $summaryString; |
||||
|
||||
echo "\n\n"; |
@ -0,0 +1,93 @@
|
||||
body |
||||
{ |
||||
background: white; |
||||
font-family:'Lucida Grande',Verdana,Geneva,Lucida,Helvetica,Arial,sans-serif; |
||||
font-size:10pt; |
||||
font-weight:normal; |
||||
} |
||||
|
||||
#page |
||||
{ |
||||
width: 800px; |
||||
margin: 0 auto; |
||||
} |
||||
|
||||
#header |
||||
{ |
||||
} |
||||
|
||||
#content |
||||
{ |
||||
} |
||||
|
||||
#footer |
||||
{ |
||||
color: gray; |
||||
font-size:8pt; |
||||
border-top:1px solid #aaa; |
||||
margin-top:10px; |
||||
} |
||||
|
||||
h1 |
||||
{ |
||||
color:black; |
||||
font-size:1.6em; |
||||
font-weight:bold; |
||||
margin:0.5em 0pt; |
||||
} |
||||
|
||||
h2 |
||||
{ |
||||
color:black; |
||||
font-size:1.25em; |
||||
font-weight:bold; |
||||
margin:0.3em 0pt; |
||||
} |
||||
|
||||
h3 |
||||
{ |
||||
color:black; |
||||
font-size:1.1em; |
||||
font-weight:bold; |
||||
margin:0.2em 0pt; |
||||
} |
||||
|
||||
table.result |
||||
{ |
||||
background:#E6ECFF none repeat scroll 0% 0%; |
||||
border-collapse:collapse; |
||||
width:100%; |
||||
} |
||||
|
||||
table.result th |
||||
{ |
||||
background:#CCD9FF none repeat scroll 0% 0%; |
||||
text-align:left; |
||||
} |
||||
|
||||
table.result th, table.result td |
||||
{ |
||||
border:1px solid #BFCFFF; |
||||
padding:0.2em; |
||||
} |
||||
|
||||
td.passed |
||||
{ |
||||
background-color: #60BF60; |
||||
border: 1px solid silver; |
||||
padding: 2px; |
||||
} |
||||
|
||||
td.warning |
||||
{ |
||||
background-color: #FFFFBF; |
||||
border: 1px solid silver; |
||||
padding: 2px; |
||||
} |
||||
|
||||
td.failed |
||||
{ |
||||
background-color: #FF8080; |
||||
border: 1px solid silver; |
||||
padding: 2px; |
||||
} |
@ -0,0 +1,82 @@
|
||||
<?php |
||||
/* @var $this YiiRequirementChecker */ |
||||
/* @var $summary array */ |
||||
/* @var $requirements array[] */ |
||||
?> |
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
||||
<head> |
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
||||
<meta http-equiv="content-language" content="en"/> |
||||
<style type="text/css"> |
||||
<?php $this->renderViewFile(dirname(__FILE__).DIRECTORY_SEPARATOR.'css.php'); ?> |
||||
</style> |
||||
<title>Yii Application Requirement Checker</title> |
||||
</head> |
||||
|
||||
<body> |
||||
<div id="page"> |
||||
|
||||
<div id="header"> |
||||
<h1>Yii Application Requirement Checker</h1> |
||||
</div><!-- header--> |
||||
|
||||
<div id="content"> |
||||
<h2>Description</h2> |
||||
<p> |
||||
This script checks if your server configuration meets the requirements |
||||
for running Yii application. |
||||
It checks if the server is running the right version of PHP, |
||||
if appropriate PHP extensions have been loaded, and if php.ini file settings are correct. |
||||
</p> |
||||
|
||||
<h2>Conclusion</h2> |
||||
<p> |
||||
<?php if ($summary['errors']>0): ?> |
||||
Unfortunately your server configuration does not satisfy the requirements by this application. |
||||
<?php elseif ($summary['warnings']>0): ?> |
||||
Your server configuration satisfies the minimum requirements by this application. Please pay attention to the warnings listed below if your application will use the corresponding features. |
||||
<?php else: ?> |
||||
Congratulations! Your server configuration satisfies all requirements. |
||||
<?php endif; ?> |
||||
</p> |
||||
|
||||
<h2>Details</h2> |
||||
|
||||
<table class="result"> |
||||
<tr><th>Name</th><th>Result</th><th>Required By</th><th>Memo</th></tr> |
||||
<?php foreach($requirements as $requirement): ?> |
||||
<tr> |
||||
<td> |
||||
<?php echo $requirement['name']; ?> |
||||
</td> |
||||
<td class="<?php echo $requirement['condition'] ? 'passed' : ($requirement['mandatory'] ? 'failed' : 'warning'); ?>">
|
||||
<?php echo $requirement['condition'] ? 'Passed' : ($requirement['mandatory'] ? 'Failed' : 'Warning'); ?> |
||||
</td> |
||||
<td> |
||||
<?php echo $requirement['by']; ?> |
||||
</td> |
||||
<td> |
||||
<?php echo $requirement['memo']; ?> |
||||
</td> |
||||
</tr> |
||||
<?php endforeach; ?> |
||||
</table> |
||||
|
||||
<table> |
||||
<tr> |
||||
<td class="passed"> </td><td>passed</td> |
||||
<td class="failed"> </td><td>failed</td> |
||||
<td class="warning"> </td><td>warning</td> |
||||
</tr> |
||||
</table> |
||||
|
||||
</div><!-- content --> |
||||
|
||||
<div id="footer"> |
||||
<?php echo $this->getServerInfo().' '.$this->getNowDate(); ?> |
||||
</div><!-- footer --> |
||||
|
||||
</div><!-- page --> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue