2015-08-17 17:00:26 -07: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 ;
/**
2015-10-08 11:40:12 -07:00
* Returns true when Xdebug is supported or
* the runtime used is PHPDBG ( PHP >= 7.0 ) .
2015-08-17 17:00:26 -07:00
*
2015-10-08 11:40:12 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
*/
public function canCollectCodeCoverage ()
{
2015-10-08 11:40:12 -07:00
return $this -> hasXdebug () || $this -> hasPHPDBGCodeCoverage ();
2015-08-17 17:00:26 -07:00
}
/**
* 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' )) {
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 ) {
2015-10-08 11:40:12 -07:00
$tmp = explode ( ' ' , $file [ 0 ]);
2015-08-17 17:00:26 -07:00
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 = array (
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' ;
2015-10-08 11:40:12 -07:00
} elseif ( $this -> isPHPDBG ()) {
return 'PHPDBG' ;
2015-08-17 17:00:26 -07:00
} else {
return 'PHP' ;
}
}
/**
* @ return string
*/
public function getVendorUrl ()
{
if ( $this -> isHHVM ()) {
return 'http://hhvm.com/' ;
} else {
return 'http://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 .
*
2015-10-08 11:40:12 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
*/
public function hasXdebug ()
{
2015-10-08 11:40:12 -07:00
return ( $this -> isPHP () || $this -> isHHVM ()) && extension_loaded ( 'xdebug' );
2015-08-17 17:00:26 -07:00
}
/**
* Returns true when the runtime used is HHVM .
*
2015-10-08 11:40:12 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
*/
public function isHHVM ()
{
return defined ( 'HHVM_VERSION' );
}
/**
2015-10-08 11:40:12 -07:00
* Returns true when the runtime used is PHP without the PHPDBG SAPI .
2015-08-17 17:00:26 -07:00
*
2015-10-08 11:40:12 -07:00
* @ return bool
2015-08-17 17:00:26 -07:00
*/
public function isPHP ()
{
2015-10-08 11:40:12 -07:00
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' );
2015-08-17 17:00:26 -07:00
}
}