annotate vendor/sebastian/environment/src/Runtime.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents 5311817fb629
children
rev   line source
Chris@0 1 <?php
Chris@0 2 /*
Chris@2 3 * This file is part of sebastian/environment.
Chris@0 4 *
Chris@0 5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
Chris@0 6 *
Chris@0 7 * For the full copyright and license information, please view the LICENSE
Chris@0 8 * file that was distributed with this source code.
Chris@0 9 */
Chris@0 10
Chris@2 11 declare(strict_types=1);
Chris@2 12
Chris@0 13 namespace SebastianBergmann\Environment;
Chris@0 14
Chris@0 15 /**
Chris@0 16 * Utility class for HHVM/PHP environment handling.
Chris@0 17 */
Chris@2 18 final class Runtime
Chris@0 19 {
Chris@0 20 /**
Chris@0 21 * @var string
Chris@0 22 */
Chris@0 23 private static $binary;
Chris@0 24
Chris@0 25 /**
Chris@0 26 * Returns true when Xdebug is supported or
Chris@2 27 * the runtime used is PHPDBG.
Chris@0 28 */
Chris@2 29 public function canCollectCodeCoverage(): bool
Chris@0 30 {
Chris@0 31 return $this->hasXdebug() || $this->hasPHPDBGCodeCoverage();
Chris@0 32 }
Chris@0 33
Chris@0 34 /**
Chris@2 35 * Returns true when OPcache is loaded and opcache.save_comments=0 is set.
Chris@2 36 *
Chris@2 37 * Code taken from Doctrine\Common\Annotations\AnnotationReader::__construct().
Chris@2 38 */
Chris@2 39 public function discardsComments(): bool
Chris@2 40 {
Chris@2 41 if (\extension_loaded('Zend Optimizer+') && (\ini_get('zend_optimizerplus.save_comments') === '0' || \ini_get('opcache.save_comments') === '0')) {
Chris@2 42 return true;
Chris@2 43 }
Chris@2 44
Chris@2 45 if (\extension_loaded('Zend OPcache') && \ini_get('opcache.save_comments') == 0) {
Chris@2 46 return true;
Chris@2 47 }
Chris@2 48
Chris@2 49 return false;
Chris@2 50 }
Chris@2 51
Chris@2 52 /**
Chris@0 53 * Returns the path to the binary of the current runtime.
Chris@0 54 * Appends ' --php' to the path when the runtime is HHVM.
Chris@0 55 */
Chris@2 56 public function getBinary(): string
Chris@0 57 {
Chris@0 58 // HHVM
Chris@0 59 if (self::$binary === null && $this->isHHVM()) {
Chris@2 60 // @codeCoverageIgnoreStart
Chris@2 61 if ((self::$binary = \getenv('PHP_BINARY')) === false) {
Chris@0 62 self::$binary = PHP_BINARY;
Chris@0 63 }
Chris@0 64
Chris@2 65 self::$binary = \escapeshellarg(self::$binary) . ' --php' .
Chris@2 66 ' -d hhvm.php7.all=1';
Chris@2 67 // @codeCoverageIgnoreEnd
Chris@0 68 }
Chris@0 69
Chris@2 70 if (self::$binary === null && PHP_BINARY !== '') {
Chris@2 71 self::$binary = \escapeshellarg(PHP_BINARY);
Chris@0 72 }
Chris@0 73
Chris@0 74 if (self::$binary === null) {
Chris@2 75 // @codeCoverageIgnoreStart
Chris@2 76 $possibleBinaryLocations = [
Chris@0 77 PHP_BINDIR . '/php',
Chris@0 78 PHP_BINDIR . '/php-cli.exe',
Chris@0 79 PHP_BINDIR . '/php.exe'
Chris@2 80 ];
Chris@0 81
Chris@0 82 foreach ($possibleBinaryLocations as $binary) {
Chris@2 83 if (\is_readable($binary)) {
Chris@2 84 self::$binary = \escapeshellarg($binary);
Chris@0 85 break;
Chris@0 86 }
Chris@0 87 }
Chris@2 88 // @codeCoverageIgnoreEnd
Chris@0 89 }
Chris@0 90
Chris@0 91 if (self::$binary === null) {
Chris@2 92 // @codeCoverageIgnoreStart
Chris@0 93 self::$binary = 'php';
Chris@2 94 // @codeCoverageIgnoreEnd
Chris@0 95 }
Chris@0 96
Chris@0 97 return self::$binary;
Chris@0 98 }
Chris@0 99
Chris@2 100 public function getNameWithVersion(): string
Chris@0 101 {
Chris@0 102 return $this->getName() . ' ' . $this->getVersion();
Chris@0 103 }
Chris@0 104
Chris@2 105 public function getName(): string
Chris@0 106 {
Chris@0 107 if ($this->isHHVM()) {
Chris@2 108 // @codeCoverageIgnoreStart
Chris@0 109 return 'HHVM';
Chris@2 110 // @codeCoverageIgnoreEnd
Chris@2 111 }
Chris@2 112
Chris@2 113 if ($this->isPHPDBG()) {
Chris@2 114 // @codeCoverageIgnoreStart
Chris@0 115 return 'PHPDBG';
Chris@2 116 // @codeCoverageIgnoreEnd
Chris@0 117 }
Chris@2 118
Chris@2 119 return 'PHP';
Chris@0 120 }
Chris@0 121
Chris@2 122 public function getVendorUrl(): string
Chris@0 123 {
Chris@0 124 if ($this->isHHVM()) {
Chris@2 125 // @codeCoverageIgnoreStart
Chris@0 126 return 'http://hhvm.com/';
Chris@2 127 // @codeCoverageIgnoreEnd
Chris@0 128 }
Chris@2 129
Chris@2 130 return 'https://secure.php.net/';
Chris@0 131 }
Chris@0 132
Chris@2 133 public function getVersion(): string
Chris@0 134 {
Chris@0 135 if ($this->isHHVM()) {
Chris@2 136 // @codeCoverageIgnoreStart
Chris@0 137 return HHVM_VERSION;
Chris@2 138 // @codeCoverageIgnoreEnd
Chris@0 139 }
Chris@2 140
Chris@2 141 return PHP_VERSION;
Chris@0 142 }
Chris@0 143
Chris@0 144 /**
Chris@0 145 * Returns true when the runtime used is PHP and Xdebug is loaded.
Chris@0 146 */
Chris@2 147 public function hasXdebug(): bool
Chris@0 148 {
Chris@2 149 return ($this->isPHP() || $this->isHHVM()) && \extension_loaded('xdebug');
Chris@0 150 }
Chris@0 151
Chris@0 152 /**
Chris@0 153 * Returns true when the runtime used is HHVM.
Chris@0 154 */
Chris@2 155 public function isHHVM(): bool
Chris@0 156 {
Chris@2 157 return \defined('HHVM_VERSION');
Chris@0 158 }
Chris@0 159
Chris@0 160 /**
Chris@0 161 * Returns true when the runtime used is PHP without the PHPDBG SAPI.
Chris@0 162 */
Chris@2 163 public function isPHP(): bool
Chris@0 164 {
Chris@0 165 return !$this->isHHVM() && !$this->isPHPDBG();
Chris@0 166 }
Chris@0 167
Chris@0 168 /**
Chris@0 169 * Returns true when the runtime used is PHP with the PHPDBG SAPI.
Chris@0 170 */
Chris@2 171 public function isPHPDBG(): bool
Chris@0 172 {
Chris@0 173 return PHP_SAPI === 'phpdbg' && !$this->isHHVM();
Chris@0 174 }
Chris@0 175
Chris@0 176 /**
Chris@0 177 * Returns true when the runtime used is PHP with the PHPDBG SAPI
Chris@0 178 * and the phpdbg_*_oplog() functions are available (PHP >= 7.0).
Chris@0 179 *
Chris@2 180 * @codeCoverageIgnore
Chris@0 181 */
Chris@2 182 public function hasPHPDBGCodeCoverage(): bool
Chris@0 183 {
Chris@2 184 return $this->isPHPDBG();
Chris@0 185 }
Chris@0 186 }