public static function run()

in src/common.php [5:211]


    public static function run()
    {
        error_reporting(0);

        define('HHVM_PHP_INI', "/etc/hhvm/php.ini");
        define('HHVM_SERVER_INI', "/etc/hhvm/server.ini");
        define('XDEBUG', "xdebug");
        define('ZEND_DEBUGGER', "Zend Debugger");

        function createXmlHeader()
        {
            return "<?xml version=\"1.0\"?>";
        }

        function createXmlElement($tagName, $attributes, $content = null)
        {
            $result = "";
            $result .= "<section";
            foreach ($attributes as $attributeName => $attributeValue) {
                $result .= " {$attributeName}=\"$attributeValue\"";
            }
            $result .= " section_name=\"$tagName\"";
            if (! empty($content)) {
                $result .= ">";
                $result .= $content;
                $result .= "</section>";
            } else {
                $result .= "/>";
            }

            return $result;
        }

        function collectConfigurationFiles()
        {
            $files = [php_ini_loaded_file()];
            $scannedFiles = php_ini_scanned_files();
            if ($scannedFiles) {
                foreach (explode(',', $scannedFiles) as $file) {
                    array_push($files, trim($file));
                }
            }

            return $files;
        }

        function validateXdebug()
        {
            $element = [];
            $element["name"] = XDEBUG;
            $element["zend_extension"] = isLoadByZendExtension($element);
            $element["version"] = htmlspecialchars(phpversion(XDEBUG));
            $element["enable"] = htmlspecialchars(ini_get("xdebug.remote_enable"));
            $element["xdebug3_debug_mode"] = htmlspecialchars(ini_get("xdebug.mode"));
            $element["host"] = htmlspecialchars(ini_get("xdebug.remote_host"));
            $element["xdebug3_host"] = htmlspecialchars(ini_get("xdebug.client_host"));
            $element["port"] = htmlspecialchars(ini_get("xdebug.remote_port"));
            $element["xdebug3_port"] = htmlspecialchars(ini_get("xdebug.client_port"));
            $element["mode"] = htmlspecialchars(ini_get("xdebug.remote_mode"));
            $element["protocol"] = htmlspecialchars(ini_get("xdebug.remote_handler"));
            $element["log"] = htmlspecialchars(ini_get("xdebug.remote_log"));
            $element["xdebug3_log"] = htmlspecialchars(ini_get("xdebug.log"));
            $element["autostart"] = htmlspecialchars(ini_get("xdebug.remote_autostart"));
            $element["xdebug3_autostart"] = htmlspecialchars(ini_get("xdebug.start_with_request"));
            $element["connect_back"] = htmlspecialchars(ini_get("xdebug.remote_connect_back"));
            $element["xdebug3_start_upon_error"] = htmlspecialchars(ini_get("xdebug.start_upon_error"));
            $element["xdebug3_discover_client_host"] = htmlspecialchars(ini_get("xdebug.discover_client_host"));
            $element["xdebug3_client_discovery_header"] = htmlspecialchars(ini_get("xdebug.client_discovery_header"));
            $element["xdebug3_cloud_userid"] = htmlspecialchars(ini_get("xdebug.cloud_id"));

            return $element;
        }

        function isLoadByZendExtension()
        {
            $warning = error_get_last();
            if (isset($warning) && is_array($warning) &&
                strcasecmp($warning["message"], "Xdebug MUST be loaded as a Zend extension") == 0) {
                return "0";
            }

            return "1";
        }

        function validateZendDebugger()
        {
            $element = [];
            $element["name"] = ZEND_DEBUGGER;
            $element["enable"] = htmlspecialchars(ini_get("zend_debugger.expose_remotely"));
            $element["host"] = htmlspecialchars(ini_get("zend_debugger.allow_hosts"));
            $element["deny_hosts"] = htmlspecialchars(ini_get("zend_debugger.deny_hosts"));

            return $element;
        }

        /**
         * @param array $config
         * @return array
         */
        function checkHostAccessibility(array $config, array $options)
        {
            $url = version_compare($options["version"], '3.0.0') ? $options["xdebug3_host"] : $options["host"];
            $port = version_compare($options["version"], '3.0.0') ? $options["xdebug3_port"] : $options["port"];
            $fp = stream_socket_client("tcp://$url:$port", $errno, $errstr, 30);
            if (! $fp) {
                $config["status"] = "FAIL";
            } else {
                $config["status"] = "OK";
                $status_message = '<?xml version="1.0" encoding="iso-8859-1"?>
<response xmlns="urn:debugger_protocol_v1"  command="phpstorm_validation" transaction_id="24" status="stopping" reason="ok"></response>';
                fwrite($fp, strlen($status_message) . "\0" . $status_message . "\0");
                $fread = fread($fp, 5);
                $config["PhpStorm_status"] = $fread === "Ready" ? "OK" : "FAIL";
                fclose($fp);
            }

            return $config;
        }

        function checkDocker(array $config)
        {
            $config["inside_docker"] = file_exists('/.dockerenv') ? 'YES' : 'NO';

            return $config;
        }

        function hhvmVersion()
        {
            if (defined('HHVM_VERSION')) {
                return HHVM_VERSION;
            }

            return null;
        }

        $hhvm = hhvmVersion();

        $result = createXmlHeader();
        $content = "";
        $file = php_ini_loaded_file();
        if ((is_null($file) || ! $file) && ! is_null($hhvm)) {
            $file = HHVM_PHP_INI;
        }
        $content .= createXmlElement(
            "Loaded php.ini",
            [
                "path" => htmlspecialchars($file),
            ]
        );

        $scannedFiles = php_ini_scanned_files();
        if ((is_null($scannedFiles) || ! $scannedFiles) && ! is_null($hhvm)) {
            $scannedFiles = HHVM_SERVER_INI;
        }

        if (! is_null($scannedFiles)) {
            $prepared = "";
            $allScannedFiles = explode(',', $scannedFiles);
            $count = count($allScannedFiles);
            if ($count > 0) {
                $prepared .= trim($allScannedFiles[0]);
                for ($i = 1; $i < $count; $i++) {
                    $prepared .= ", ";
                    $prepared .= trim($allScannedFiles[$i]);
                }
                $content .= createXmlElement(
                    "Additional php.ini",
                    [
                        "files" => htmlspecialchars($prepared),
                    ]
                );
            }
        }

        $xdebug = extension_loaded(XDEBUG);
        if ($xdebug) {
            $config = validateXdebug();
            $content .= createXmlElement("Debugger", $config);
            $content .= createXmlElement("Xdebug Connection", checkHostAccessibility([], $config));
        }

        $content .= createXmlElement("Docker", checkDocker([]));

        $zend_debug = extension_loaded(ZEND_DEBUGGER);
        if ($zend_debug) {
            $config = validateZendDebugger();
            $content .= createXmlElement("Debugger", $config);
        }

        $serverName = $_SERVER["SERVER_NAME"];
        $remoteAddr = $_SERVER["REMOTE_ADDR"];
        if (! is_null($serverName) || ! is_null($remoteAddr)) {
            $element = [];
            if (! is_null($serverName)) {
                $element["server_name"] = htmlspecialchars($serverName);
            }
            if (! is_null($remoteAddr)) {
                $element["client_host"] = htmlspecialchars($remoteAddr);
            }
            $element['server_OS'] = php_uname('s') . php_uname('r');
            $content .= createXmlElement("Server", $element);
        }

        $result . createXmlElement("validation", [], $content);

        return "<report>" . $content . "</report>";
    }