관리-도구
편집 파일: SoftaculousPHPSwitcher.php
<?php function get_php_version($cpanel, $domain) { try { $phpVerResp = $cpanel->uapi( 'PHPSelector', 'get_php_version_for_domain', array( 'domain' => $domain, ) ); return $phpVerResp["cpanelresult"]["result"]["data"]["version"]; } catch (Exception $e) { $err = $e->getMessage(); error_log("SOFTACULOUS can\'t get PHP version for domain: $domain - $err"); } } function get_available_php_versions($cpanel) { try { $resp = $cpanel->uapi( 'PHPSelector', 'list_php_versions', ); $resp_parsed = print_r( $resp, true ); return $resp["cpanelresult"]["result"]["data"]["versions"]; } catch (Exception $e) { $err = $e->getMessage(); error_log("SOFTACULOUS can't get php versions, live api error: $err"); } return []; } function set_php_version($cpanel, $domain, $ver) { try { $phpVerResp = $cpanel->uapi( 'PHPSelector', 'set_php_version_for_domain', array( 'domain' => $domain, "php" => $ver, ) ); return $phpVerResp["cpanelresult"]["result"]["data"]["version"]; } catch (Exception $e) { $err = $e->getMessage(); error_log("SOFTACULOUS can't set php version $ver for domain $domain, live api error: $err"); } } function get_extensions($cpanel, $domain, $ver) { try { $phpVerResp = $cpanel->uapi( 'PHPSelector', 'get_php_extensions_for_domain', array( 'domain' => $domain, "php" => $ver, ) ); return $phpVerResp["cpanelresult"]["result"]["data"]; } catch (Exception $e) { $err = $e->getMessage(); error_log("SOFTACULOUS error api: $err"); } return []; } function resolve_domain($cpanel, $proxy_domain) { try { $res = $cpanel->uapi( 'DomainInfo', 'domains_data', array( 'format' => "list", ) ); foreach ($res["cpanelresult"]["result"]["data"] as $domain) { if ($domain["domain"] == $proxy_domain) { return $domain["servername"]; } } } catch (Exception $e) { $err = $e->getMessage(); error_log("SOFTACULOUS error api: $err"); } return $proxy_domain; } function normalise_php_version($version) { $splited = explode(".", $version, 3); if (count($splited) == 3) { array_pop($splited); } return implode(".", $splited); } function get_php_version_mapping() { $php_map = []; @exec("/usr/bin/selectorctl --list --json", $raw, $ret); $json_data = json_decode($raw[0], true); foreach($json_data['data'] as $php) { $php_map[$php["short"]] = $php["full"]; } return $php_map; } function resolve_full_php_version($version, $mapping) { return $mapping[$version]; } function HOOK_PHP_VERSION_SWITCH($domain_alias) { global $cpanel, $soft, $scripts, $softpanel, $error, $__hooks; $domain = resolve_domain($cpanel, $domain_alias); $current_php = get_php_version($cpanel, $domain); $php_mapping = get_php_version_mapping(); $current_php_full = resolve_full_php_version($current_php, $php_mapping); $cms_php_min = $scripts[$soft]['php_min']; $cms_php_max = $scripts[$soft]['php_max']; $fit_min_php = 1; $fit_max_php = 1; if(!empty($cms_php_min)){ $fit_min_php = sversion_compare($current_php_full, $cms_php_min, '>='); } if(!empty($cms_php_max)){ $fit_max_php = sversion_compare($current_php_full, $cms_php_max, '<='); } if(!$fit_min_php || !$fit_max_php){ if(!empty($cms_php_min)){ $fit_min_php = 0; } if(!empty($cms_php_max)){ $fit_max_php = 0; } $available_php_versions = get_available_php_versions($cpanel); rsort($available_php_versions); foreach($available_php_versions as $ver){ $ver_full = resolve_full_php_version($ver, $php_mapping); if(!$fit_min_php) { $fit_min_php = sversion_compare($ver_full, $cms_php_min, '>='); } if(!$fit_max_php) { $fit_max_php = sversion_compare($ver_full, $cms_php_max, '<='); } // error_log("Check ver: $ver_full max: $cms_php_max, min: $cms_php_min, fit: ($fit_max_php,$fit_min_php)"); // Left for debug if($fit_min_php && $fit_max_php){ // Ask for a confirmation if(!checkbox('php_version_select')){ $error[] = 'Current PHP version is '.$current_php_full.', unfortunately it does not fit CMS requirements <br /> <input type="checkbox" name="php_version_select" '.POSTChecked('php_version_select').' /> Do you wish to enable PHP '.$ver_full.' ? (Might cause issues with your existing installations).'; }else{ $current_php = set_php_version($cpanel, $domain, $ver); $current_php_full = resolve_full_php_version($current_php, $php_mapping); } break; } } } $extensions = get_extensions($cpanel, $domain, $current_php); foreach ($extensions as $ext_name=>$ext_data){ if ($ext_data["state"] != "disabled") { $__hooks['loaded_extension'][] = $ext_name; } } if(in_array('nd_mysqli', $extensions)){ $__hooks['loaded_extension'][] = 'mysqli'; } if(in_array('nd_mysql', $extensions)){ $__hooks['loaded_extension'][] = 'mysql'; } if(in_array('nd_pdo_mysql', $extensions)){ $__hooks['loaded_extension'][] = 'pdo_mysql'; } define('PHP_EXT_EXHAUSTIVE', 1); define('php_version', $current_php_full); } ?>