Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. DiagnoseCommand.php

function DiagnoseCommand::checkPlatform

Return value

string|true

1 call to DiagnoseCommand::checkPlatform()
DiagnoseCommand::execute in vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php
Executes the current command.

File

vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php, line 677

Class

DiagnoseCommand
@author Jordi Boggiano <j.boggiano@seld.be>

Namespace

Composer\Command

Code

private function checkPlatform() {
    $output = '';
    $out = static function ($msg, $style) use (&$output) : void {
        $output .= '<' . $style . '>' . $msg . '</' . $style . '>' . PHP_EOL;
    };
    // code below taken from getcomposer.org/installer, any changes should be made there and replicated here
    $errors = [];
    $warnings = [];
    $displayIniMessage = false;
    $iniMessage = PHP_EOL . PHP_EOL . IniHelper::getMessage();
    $iniMessage .= PHP_EOL . 'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.';
    if (!function_exists('json_decode')) {
        $errors['json'] = true;
    }
    if (!extension_loaded('Phar')) {
        $errors['phar'] = true;
    }
    if (!extension_loaded('filter')) {
        $errors['filter'] = true;
    }
    if (!extension_loaded('hash')) {
        $errors['hash'] = true;
    }
    if (!extension_loaded('iconv') && !extension_loaded('mbstring')) {
        $errors['iconv_mbstring'] = true;
    }
    if (!filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) {
        $errors['allow_url_fopen'] = true;
    }
    if (extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) {
        $errors['ioncube'] = ioncube_loader_version();
    }
    if (\PHP_VERSION_ID < 70205) {
        $errors['php'] = PHP_VERSION;
    }
    if (!extension_loaded('openssl')) {
        $errors['openssl'] = true;
    }
    if (extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < 0x1000100f) {
        $warnings['openssl_version'] = true;
    }
    if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN)) {
        $warnings['apc_cli'] = true;
    }
    if (!extension_loaded('zlib')) {
        $warnings['zlib'] = true;
    }
    ob_start();
    phpinfo(INFO_GENERAL);
    $phpinfo = ob_get_clean();
    if (is_string($phpinfo) && Preg::isMatchStrictGroups('{Configure Command(?: *</td><td class="v">| *=> *)(.*?)(?:</td>|$)}m', $phpinfo, $match)) {
        $configure = $match[1];
        if (str_contains($configure, '--enable-sigchild')) {
            $warnings['sigchild'] = true;
        }
        if (str_contains($configure, '--with-curlwrappers')) {
            $warnings['curlwrappers'] = true;
        }
    }
    if (filter_var(ini_get('xdebug.profiler_enabled'), FILTER_VALIDATE_BOOLEAN)) {
        $warnings['xdebug_profile'] = true;
    }
    elseif (XdebugHandler::isXdebugActive()) {
        $warnings['xdebug_loaded'] = true;
    }
    if (defined('PHP_WINDOWS_VERSION_BUILD') && (version_compare(PHP_VERSION, '7.2.23', '<') || version_compare(PHP_VERSION, '7.3.0', '>=') && version_compare(PHP_VERSION, '7.3.10', '<'))) {
        $warnings['onedrive'] = PHP_VERSION;
    }
    if (extension_loaded('uopz') && !(filter_var(ini_get('uopz.disable'), FILTER_VALIDATE_BOOLEAN) || filter_var(ini_get('uopz.exit'), FILTER_VALIDATE_BOOLEAN))) {
        $warnings['uopz'] = true;
    }
    if (!empty($errors)) {
        foreach ($errors as $error => $current) {
            switch ($error) {
                case 'json':
                    $text = PHP_EOL . "The json extension is missing." . PHP_EOL;
                    $text .= "Install it or recompile php without --disable-json";
                    break;
                case 'phar':
                    $text = PHP_EOL . "The phar extension is missing." . PHP_EOL;
                    $text .= "Install it or recompile php without --disable-phar";
                    break;
                case 'filter':
                    $text = PHP_EOL . "The filter extension is missing." . PHP_EOL;
                    $text .= "Install it or recompile php without --disable-filter";
                    break;
                case 'hash':
                    $text = PHP_EOL . "The hash extension is missing." . PHP_EOL;
                    $text .= "Install it or recompile php without --disable-hash";
                    break;
                case 'iconv_mbstring':
                    $text = PHP_EOL . "The iconv OR mbstring extension is required and both are missing." . PHP_EOL;
                    $text .= "Install either of them or recompile php without --disable-iconv";
                    break;
                case 'php':
                    $text = PHP_EOL . "Your PHP ({$current}) is too old, you must upgrade to PHP 7.2.5 or higher.";
                    break;
                case 'allow_url_fopen':
                    $text = PHP_EOL . "The allow_url_fopen setting is incorrect." . PHP_EOL;
                    $text .= "Add the following to the end of your `php.ini`:" . PHP_EOL;
                    $text .= "    allow_url_fopen = On";
                    $displayIniMessage = true;
                    break;
                case 'ioncube':
                    $text = PHP_EOL . "Your ionCube Loader extension ({$current}) is incompatible with Phar files." . PHP_EOL;
                    $text .= "Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:" . PHP_EOL;
                    $text .= "    zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so";
                    $displayIniMessage = true;
                    break;
                case 'openssl':
                    $text = PHP_EOL . "The openssl extension is missing, which means that secure HTTPS transfers are impossible." . PHP_EOL;
                    $text .= "If possible you should enable it or recompile php with --with-openssl";
                    break;
                default:
                    throw new \InvalidArgumentException(sprintf("DiagnoseCommand: Unknown error type \"%s\". Please report at https://github.com/composer/composer/issues/new.", $error));
            }
            $out($text, 'error');
        }
        $output .= PHP_EOL;
    }
    if (!empty($warnings)) {
        foreach ($warnings as $warning => $current) {
            switch ($warning) {
                case 'apc_cli':
                    $text = "The apc.enable_cli setting is incorrect." . PHP_EOL;
                    $text .= "Add the following to the end of your `php.ini`:" . PHP_EOL;
                    $text .= "  apc.enable_cli = Off";
                    $displayIniMessage = true;
                    break;
                case 'zlib':
                    $text = 'The zlib extension is not loaded, this can slow down Composer a lot.' . PHP_EOL;
                    $text .= 'If possible, enable it or recompile php with --with-zlib' . PHP_EOL;
                    $displayIniMessage = true;
                    break;
                case 'sigchild':
                    $text = "PHP was compiled with --enable-sigchild which can cause issues on some platforms." . PHP_EOL;
                    $text .= "Recompile it without this flag if possible, see also:" . PHP_EOL;
                    $text .= "  https://bugs.php.net/bug.php?id=22999";
                    break;
                case 'curlwrappers':
                    $text = "PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub." . PHP_EOL;
                    $text .= " Recompile it without this flag if possible";
                    break;
                case 'openssl_version':
                    // Attempt to parse version number out, fallback to whole string value.
                    $opensslVersion = strstr(trim(strstr(OPENSSL_VERSION_TEXT, ' ')), ' ', true);
                    $opensslVersion = $opensslVersion ?: OPENSSL_VERSION_TEXT;
                    $text = "The OpenSSL library ({$opensslVersion}) used by PHP does not support TLSv1.2 or TLSv1.1." . PHP_EOL;
                    $text .= "If possible you should upgrade OpenSSL to version 1.0.1 or above.";
                    break;
                case 'xdebug_loaded':
                    $text = "The xdebug extension is loaded, this can slow down Composer a little." . PHP_EOL;
                    $text .= " Disabling it when using Composer is recommended.";
                    break;
                case 'xdebug_profile':
                    $text = "The xdebug.profiler_enabled setting is enabled, this can slow down Composer a lot." . PHP_EOL;
                    $text .= "Add the following to the end of your `php.ini` to disable it:" . PHP_EOL;
                    $text .= "  xdebug.profiler_enabled = 0";
                    $displayIniMessage = true;
                    break;
                case 'onedrive':
                    $text = "The Windows OneDrive folder is not supported on PHP versions below 7.2.23 and 7.3.10." . PHP_EOL;
                    $text .= "Upgrade your PHP ({$current}) to use this location with Composer." . PHP_EOL;
                    break;
                case 'uopz':
                    $text = "The uopz extension ignores exit calls and may not work with all Composer commands." . PHP_EOL;
                    $text .= "Disabling it when using Composer is recommended.";
                    break;
                default:
                    throw new \InvalidArgumentException(sprintf("DiagnoseCommand: Unknown warning type \"%s\". Please report at https://github.com/composer/composer/issues/new.", $warning));
            }
            $out($text, 'comment');
        }
    }
    if ($displayIniMessage) {
        $out($iniMessage, 'comment');
    }
    if (in_array(Platform::getEnv('COMPOSER_IPRESOLVE'), [
        '4',
        '6',
    ], true)) {
        $warnings['ipresolve'] = true;
        $out('The COMPOSER_IPRESOLVE env var is set to ' . Platform::getEnv('COMPOSER_IPRESOLVE') . ' which may result in network failures below.', 'comment');
    }
    return count($warnings) === 0 && count($errors) === 0 ? true : $output;
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal