관리-도구
편집 파일: environment.tar
LICENSE 0000777 00000003012 15224656016 0005563 0 ustar 00 Environment Copyright (c) 2014-2015, Sebastian Bergmann <sebastian@phpunit.de>. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. src/OperatingSystem.php 0000604 00000002342 15224656016 0011205 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of sebastian/environment. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use const DIRECTORY_SEPARATOR; use const PHP_OS; use const PHP_OS_FAMILY; use function defined; final class OperatingSystem { /** * Returns PHP_OS_FAMILY (if defined (which it is on PHP >= 7.2)). * Returns a string (compatible with PHP_OS_FAMILY) derived from PHP_OS otherwise. */ public function getFamily(): string { if (defined('PHP_OS_FAMILY')) { return PHP_OS_FAMILY; } if (DIRECTORY_SEPARATOR === '\\') { return 'Windows'; } switch (PHP_OS) { case 'Darwin': return 'Darwin'; case 'DragonFly': case 'FreeBSD': case 'NetBSD': case 'OpenBSD': return 'BSD'; case 'Linux': return 'Linux'; case 'SunOS': return 'Solaris'; default: return 'Unknown'; } } } src/Console.php 0000777 00000005714 15224656016 0007473 0 ustar 00 <?php /* * This file is part of the Environment package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; /** */ class Console { const STDIN = 0; const STDOUT = 1; const STDERR = 2; /** * Returns true if STDOUT supports colorization. * * This code has been copied and adapted from * Symfony\Component\Console\Output\OutputStream. * * @return bool */ public function hasColorSupport() { if (DIRECTORY_SEPARATOR == '\\') { return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM'); } if (!defined('STDOUT')) { return false; } return $this->isInteractive(STDOUT); } /** * Returns the number of columns of the terminal. * * @return int */ public function getNumberOfColumns() { if (DIRECTORY_SEPARATOR == '\\') { $columns = 80; if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { $columns = $matches[1]; } elseif (function_exists('proc_open')) { $process = proc_open( 'mode CON', [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'] ], $pipes, null, null, ['suppress_errors' => true] ); if (is_resource($process)) { $info = stream_get_contents($pipes[1]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { $columns = $matches[2]; } } } return $columns - 1; } if (!$this->isInteractive(self::STDIN)) { return 80; } if (function_exists('shell_exec') && preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } if (function_exists('shell_exec') && preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } return 80; } /** * Returns if the file descriptor is an interactive terminal or not. * * @param int|resource $fileDescriptor * * @return bool */ public function isInteractive($fileDescriptor = self::STDOUT) { return function_exists('posix_isatty') && @posix_isatty($fileDescriptor); } } src/Runtime.php 0000777 00000011172 15224656016 0007507 0 ustar 00 <?php /* * This file is part of the Environment package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; /** * Utility class for HHVM/PHP environment handling. */ class Runtime { /** * @var string */ private static $binary; /** * Returns true when Xdebug is supported or * the runtime used is PHPDBG (PHP >= 7.0). * * @return bool */ public function canCollectCodeCoverage() { return $this->hasXdebug() || $this->hasPHPDBGCodeCoverage(); } /** * Returns the path to the binary of the current runtime. * Appends ' --php' to the path when the runtime is HHVM. * * @return string */ public function getBinary() { // HHVM if (self::$binary === null && $this->isHHVM()) { if ((self::$binary = getenv('PHP_BINARY')) === false) { self::$binary = PHP_BINARY; } self::$binary = escapeshellarg(self::$binary) . ' --php'; } // PHP >= 5.4.0 if (self::$binary === null && defined('PHP_BINARY')) { if (PHP_BINARY !== '') { self::$binary = escapeshellarg(PHP_BINARY); } } // PHP < 5.4.0 if (self::$binary === null) { if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) { if (strpos($_SERVER['_'], 'phpunit') !== false) { $file = file($_SERVER['_']); if (strpos($file[0], ' ') !== false) { $tmp = explode(' ', $file[0]); self::$binary = escapeshellarg(trim($tmp[1])); } else { self::$binary = escapeshellarg(ltrim(trim($file[0]), '#!')); } } elseif (strpos(basename($_SERVER['_']), 'php') !== false) { self::$binary = escapeshellarg($_SERVER['_']); } } } if (self::$binary === null) { $possibleBinaryLocations = [ PHP_BINDIR . '/php', PHP_BINDIR . '/php-cli.exe', PHP_BINDIR . '/php.exe' ]; foreach ($possibleBinaryLocations as $binary) { if (is_readable($binary)) { self::$binary = escapeshellarg($binary); break; } } } if (self::$binary === null) { self::$binary = 'php'; } return self::$binary; } /** * @return string */ public function getNameWithVersion() { return $this->getName() . ' ' . $this->getVersion(); } /** * @return string */ public function getName() { if ($this->isHHVM()) { return 'HHVM'; } elseif ($this->isPHPDBG()) { return 'PHPDBG'; } else { return 'PHP'; } } /** * @return string */ public function getVendorUrl() { if ($this->isHHVM()) { return 'http://hhvm.com/'; } else { return 'https://secure.php.net/'; } } /** * @return string */ public function getVersion() { if ($this->isHHVM()) { return HHVM_VERSION; } else { return PHP_VERSION; } } /** * Returns true when the runtime used is PHP and Xdebug is loaded. * * @return bool */ public function hasXdebug() { return ($this->isPHP() || $this->isHHVM()) && extension_loaded('xdebug'); } /** * Returns true when the runtime used is HHVM. * * @return bool */ public function isHHVM() { return defined('HHVM_VERSION'); } /** * Returns true when the runtime used is PHP without the PHPDBG SAPI. * * @return bool */ public function isPHP() { return !$this->isHHVM() && !$this->isPHPDBG(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI. * * @return bool */ public function isPHPDBG() { return PHP_SAPI === 'phpdbg' && !$this->isHHVM(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI * and the phpdbg_*_oplog() functions are available (PHP >= 7.0). * * @return bool */ public function hasPHPDBGCodeCoverage() { return $this->isPHPDBG() && function_exists('phpdbg_start_oplog'); } } composer.json 0000777 00000001311 15224656016 0007300 0 ustar 00 { "name": "sebastian/environment", "description": "Provides functionality to handle HHVM/PHP environments", "keywords": ["environment","hhvm","xdebug"], "homepage": "http://www.github.com/sebastianbergmann/environment", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^5.0" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } ChangeLog.md 0000604 00000012274 15224656016 0006726 0 ustar 00 # Changes in sebastianbergmann/environment All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.1.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.1.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [5.1.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [5.1.0] - 2020-04-14 ### Added * `Runtime::performsJustInTimeCompilation()` returns `true` if PHP 8's JIT is active, `false` otherwise ## [5.0.2] - 2020-03-31 ### Fixed * [#55](https://github.com/sebastianbergmann/environment/issues/55): `stty` command is executed even if no tty is available ## [5.0.1] - 2020-02-19 ### Changed * `Runtime::getNameWithVersionAndCodeCoverageDriver()` now prioritizes PCOV over Xdebug when both extensions are loaded (just like php-code-coverage does) ## [5.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [4.2.3] - 2019-11-20 ### Changed * [#50](https://github.com/sebastianbergmann/environment/pull/50): Windows improvements to console capabilities ### Fixed * [#49](https://github.com/sebastianbergmann/environment/issues/49): Detection how OpCache handles docblocks does not work correctly when PHPDBG is used ## [4.2.2] - 2019-05-05 ### Fixed * [#44](https://github.com/sebastianbergmann/environment/pull/44): `TypeError` in `Console::getNumberOfColumnsInteractive()` ## [4.2.1] - 2019-04-25 ### Fixed * Fixed an issue in `Runtime::getCurrentSettings()` ## [4.2.0] - 2019-04-25 ### Added * [#36](https://github.com/sebastianbergmann/environment/pull/36): `Runtime::getCurrentSettings()` ## [4.1.0] - 2019-02-01 ### Added * Implemented `Runtime::getNameWithVersionAndCodeCoverageDriver()` method * [#34](https://github.com/sebastianbergmann/environment/pull/34): Support for PCOV extension ## [4.0.2] - 2019-01-28 ### Fixed * [#33](https://github.com/sebastianbergmann/environment/issues/33): `Runtime::discardsComments()` returns true too eagerly ### Removed * Removed support for Zend Optimizer+ in `Runtime::discardsComments()` ## [4.0.1] - 2018-11-25 ### Fixed * [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class ## [4.0.0] - 2018-10-23 [YANKED] ### Fixed * [#25](https://github.com/sebastianbergmann/environment/pull/25): `Console::hasColorSupport()` does not work on Windows ### Removed * This component is no longer supported on PHP 7.0 ## [3.1.0] - 2017-07-01 ### Added * [#21](https://github.com/sebastianbergmann/environment/issues/21): Equivalent of `PHP_OS_FAMILY` (for PHP < 7.2) ## [3.0.4] - 2017-06-20 ### Fixed * [#20](https://github.com/sebastianbergmann/environment/pull/20): PHP 7 mode of HHVM not forced ## [3.0.3] - 2017-05-18 ### Fixed * [#18](https://github.com/sebastianbergmann/environment/issues/18): `Uncaught TypeError: preg_match() expects parameter 2 to be string, null given` ## [3.0.2] - 2017-04-21 ### Fixed * [#17](https://github.com/sebastianbergmann/environment/issues/17): `Uncaught TypeError: trim() expects parameter 1 to be string, boolean given` ## [3.0.1] - 2017-04-21 ### Fixed * Fixed inverted logic in `Runtime::discardsComments()` ## [3.0.0] - 2017-04-21 ### Added * Implemented `Runtime::discardsComments()` for querying whether the PHP runtime discards annotations ### Removed * This component is no longer supported on PHP 5.6 [5.1.3]: https://github.com/sebastianbergmann/environment/compare/5.1.2...5.1.3 [5.1.2]: https://github.com/sebastianbergmann/environment/compare/5.1.1...5.1.2 [5.1.1]: https://github.com/sebastianbergmann/environment/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/environment/compare/5.0.2...5.1.0 [5.0.2]: https://github.com/sebastianbergmann/environment/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/environment/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/environment/compare/4.2.3...5.0.0 [4.2.3]: https://github.com/sebastianbergmann/environment/compare/4.2.2...4.2.3 [4.2.2]: https://github.com/sebastianbergmann/environment/compare/4.2.1...4.2.2 [4.2.1]: https://github.com/sebastianbergmann/environment/compare/4.2.0...4.2.1 [4.2.0]: https://github.com/sebastianbergmann/environment/compare/4.1.0...4.2.0 [4.1.0]: https://github.com/sebastianbergmann/environment/compare/4.0.2...4.1.0 [4.0.2]: https://github.com/sebastianbergmann/environment/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/environment/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/environment/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 [3.1.0]: https://github.com/sebastianbergmann/environment/compare/3.0...3.1.0 [3.0.4]: https://github.com/sebastianbergmann/environment/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/environment/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/environment/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/environment/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/environment/compare/2.0...3.0.0 README.md 0000777 00000004020 15224656016 0006035 0 ustar 00 # Environment This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. [](https://packagist.org/packages/sebastian/environment) [](https://travis-ci.org/sebastianbergmann/environment) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/environment If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/environment ## Usage ```php <?php use SebastianBergmann\Environment\Runtime; $runtime = new Runtime; var_dump($runtime->getNameWithVersion()); var_dump($runtime->getName()); var_dump($runtime->getVersion()); var_dump($runtime->getBinary()); var_dump($runtime->isHHVM()); var_dump($runtime->isPHP()); var_dump($runtime->hasXdebug()); var_dump($runtime->canCollectCodeCoverage()); ``` ### Output on PHP $ php --version PHP 5.5.8 (cli) (built: Jan 9 2014 08:33:30) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans $ php example.php string(9) "PHP 5.5.8" string(3) "PHP" string(5) "5.5.8" string(14) "'/usr/bin/php'" bool(false) bool(true) bool(true) bool(true) ### Output on HHVM $ hhvm --version HipHop VM 2.4.0-dev (rel) Compiler: heads/master-0-ga98e57cabee7e7f0d14493ab17d5c7ab0157eb98 Repo schema: 8d6e69287c41c1f09bb4d327421720d1922cfc67 $ hhvm example.php string(14) "HHVM 2.4.0-dev" string(4) "HHVM" string(9) "2.4.0-dev" string(42) "'/usr/local/src/hhvm/hphp/hhvm/hhvm' --php" bool(true) bool(false) bool(false) bool(true) .gitignore 0000777 00000000055 15224676627 0006564 0 ustar 00 /.idea /vendor /composer.lock /composer.phar phpunit.xml 0000777 00000001346 15224676627 0007011 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/5.4/phpunit.xsd" bootstrap="vendor/autoload.php" backupGlobals="false" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTestsThatDoNotTestAnything="true" beStrictAboutTodoAnnotatedTests="true" verbose="true"> <testsuite> <directory suffix="Test.php">tests</directory> </testsuite> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit> tests/ConsoleTest.php 0000777 00000003172 15224676627 0010714 0 ustar 00 <?php /* * This file is part of the Environment package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use PHPUnit_Framework_TestCase; class ConsoleTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\Environment\Console */ private $console; protected function setUp() { $this->console = new Console; } /** * @covers \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectIfStdoutIsInteractiveByDefault() { $this->assertInternalType('boolean', $this->console->isInteractive()); } /** * @covers \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectIfFileDescriptorIsInteractive() { $this->assertInternalType('boolean', $this->console->isInteractive(STDOUT)); } /** * @covers \SebastianBergmann\Environment\Console::hasColorSupport * * @uses \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectColorSupport() { $this->assertInternalType('boolean', $this->console->hasColorSupport()); } /** * @covers \SebastianBergmann\Environment\Console::getNumberOfColumns * * @uses \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectNumberOfColumns() { $this->assertInternalType('integer', $this->console->getNumberOfColumns()); } } tests/RuntimeTest.php 0000777 00000006537 15224676627 0010745 0 ustar 00 <?php /* * This file is part of the Environment package. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use PHPUnit_Framework_TestCase; class RuntimeTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\Environment\Runtime */ private $env; protected function setUp() { $this->env = new Runtime; } /** * @covers \SebastianBergmann\Environment\Runtime::canCollectCodeCoverage * * @uses \SebastianBergmann\Environment\Runtime::hasXdebug * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testAbilityToCollectCodeCoverageCanBeAssessed() { $this->assertInternalType('boolean', $this->env->canCollectCodeCoverage()); } /** * @covers \SebastianBergmann\Environment\Runtime::getBinary * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testBinaryCanBeRetrieved() { $this->assertInternalType('string', $this->env->getBinary()); } /** * @covers \SebastianBergmann\Environment\Runtime::isHHVM */ public function testCanBeDetected() { $this->assertInternalType('boolean', $this->env->isHHVM()); } /** * @covers \SebastianBergmann\Environment\Runtime::isPHP * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testCanBeDetected2() { $this->assertInternalType('boolean', $this->env->isPHP()); } /** * @covers \SebastianBergmann\Environment\Runtime::hasXdebug * * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testXdebugCanBeDetected() { $this->assertInternalType('boolean', $this->env->hasXdebug()); } /** * @covers \SebastianBergmann\Environment\Runtime::getNameWithVersion * * @uses \SebastianBergmann\Environment\Runtime::getName * @uses \SebastianBergmann\Environment\Runtime::getVersion * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testNameAndVersionCanBeRetrieved() { $this->assertInternalType('string', $this->env->getNameWithVersion()); } /** * @covers \SebastianBergmann\Environment\Runtime::getName * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testNameCanBeRetrieved() { $this->assertInternalType('string', $this->env->getName()); } /** * @covers \SebastianBergmann\Environment\Runtime::getVersion * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testVersionCanBeRetrieved() { $this->assertInternalType('string', $this->env->getVersion()); } /** * @covers \SebastianBergmann\Environment\Runtime::getVendorUrl * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testVendorUrlCanBeRetrieved() { $this->assertInternalType('string', $this->env->getVendorUrl()); } } build.xml 0000777 00000001454 15224676627 0006421 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <project name="environment"> <target name="clean" description="Cleanup build artifacts"> <delete dir="${basedir}/vendor"/> <delete file="${basedir}/composer.lock"/> </target> <target name="composer" depends="clean" description="Install dependencies with Composer"> <tstamp> <format property="thirty.days.ago" pattern="MM/dd/yyyy hh:mm aa" offset="-30" unit="day"/> </tstamp> <delete> <fileset dir="${basedir}"> <include name="composer.phar" /> <date datetime="${thirty.days.ago}" when="before"/> </fileset> </delete> <get src="https://getcomposer.org/composer.phar" dest="${basedir}/composer.phar" skipexisting="true"/> <exec executable="php"> <arg value="composer.phar"/> <arg value="install"/> </exec> </target> </project> .travis.yml 0000777 00000000310 15224676627 0006677 0 ustar 00 language: php sudo: false before_install: - composer self-update install: - travis_retry composer install --no-interaction --prefer-source php: - 5.6 - hhvm notifications: email: false