Ejemplo n.º 1
0
 /**
  * 根据URL初始化
  */
 private static function setup_by_url(&$request_mode)
 {
     # 处理base_url
     if (null === self::$base_url && isset($_SERVER["SCRIPT_NAME"]) && $_SERVER["SCRIPT_NAME"]) {
         $base_url_len = strrpos($_SERVER["SCRIPT_NAME"], '/');
         if ($base_url_len) {
             $base_url = substr($_SERVER["SCRIPT_NAME"], 0, $base_url_len);
             if (preg_match('#^(.*)/wwwroot$#', $base_url, $m)) {
                 # 特殊处理wwwroot目录
                 $base_url = $m[1];
                 $base_url_len = strlen($base_url);
             }
             if (strtolower(substr($_SERVER['REQUEST_URI'], 0, $base_url_len)) == strtolower($base_url)) {
                 self::$base_url = $base_url;
             }
         }
     }
     if (isset($_SERVER['PATH_INFO'])) {
         $pathinfo = $_SERVER["PATH_INFO"];
     } else {
         if (isset($_SERVER["PATH_TRANSLATED"])) {
             list($null, $pathinfo) = explode('index' . EXT, $_SERVER["PATH_TRANSLATED"], 2);
         } elseif (isset($_SERVER['REQUEST_URI'])) {
             $request_uri = $_SERVER['REQUEST_URI'];
             if (self::$base_url) {
                 $request_uri = substr($request_uri, strlen(self::$base_url));
             }
             // 移除查询参数
             list($pathinfo) = explode('?', $request_uri, 2);
         } elseif (isset($_SERVER['PHP_SELF'])) {
             $pathinfo = $_SERVER['PHP_SELF'];
         } elseif (isset($_SERVER['REDIRECT_URL'])) {
             $pathinfo = $_SERVER['REDIRECT_URL'];
         } else {
             $pathinfo = false;
         }
     }
     # 过滤pathinfo传入进来的服务器默认页
     if (false !== $pathinfo && ($indexpagelen = strlen(self::$config['core']['server_index_page'])) && substr($pathinfo, -1 - $indexpagelen) == '/' . self::$config['core']['server_index_page']) {
         $pathinfo = substr($pathinfo, 0, -$indexpagelen);
     }
     $pathinfo = trim($pathinfo);
     if (!isset($_SERVER["PATH_INFO"])) {
         $_SERVER["PATH_INFO"] = $pathinfo;
     }
     self::$path_info = $pathinfo;
     $get_path_info = function (&$url) {
         static $protocol = null, $protocol_len = 0;
         if (null === $protocol) {
             if (!empty($_SERVER['HTTPS']) && filter_var($_SERVER['HTTPS'], FILTER_VALIDATE_BOOLEAN)) {
                 $protocol = 'https://';
                 $protocol_len = 8;
             } else {
                 $protocol = 'http://';
                 $protocol_len = 7;
             }
         }
         $url = strtolower($url);
         # 结尾补/
         if (substr($url, -1) != '/') {
             $url .= '/';
         }
         if (substr($url, 0, $protocol_len) == $protocol) {
             $len = strlen($url);
             if (strtolower(substr($_SERVER["SCRIPT_URI"], 0, $len)) == $url) {
                 # 匹配到项目
                 return '/' . substr($_SERVER["SCRIPT_URI"], $len);
             }
         } else {
             # 开头补/
             if (substr($url, 0, 1) != '/') {
                 $url = '/' . $url;
             }
             $len = strlen($url);
             if (strtolower(substr(Bootstrap::$path_info, 0, $len)) == $url) {
                 # 匹配到项目
                 return '/' . substr(Bootstrap::$path_info, $len);
             }
         }
         return false;
     };
     # 项目相关设置
     if (isset(self::$config['core']['projects']) && is_array(self::$config['core']['projects']) && self::$config['core']['projects']) {
         # 处理项目
         foreach (self::$config['core']['projects'] as $project => $item) {
             if (!preg_match('#^[a-z0-9_]+$#i', $project)) {
                 continue;
             }
             $admin_url = array();
             if (isset($item['admin_url']) && $item['admin_url']) {
                 if (!is_array($item['admin_url'])) {
                     $item['admin_url'] = array($item['admin_url']);
                 }
                 foreach ($item['admin_url'] as $tmp_url) {
                     if (preg_match('#^http(s)?\\://#i', $tmp_url)) {
                         if (($path_info_admin = $get_path_info($tmp_url)) != false) {
                             self::$project = $project;
                             self::$path_info = $path_info_admin;
                             self::$base_url = $tmp_url;
                             $request_mode = 'admin';
                             break 2;
                         }
                     } else {
                         # /开头的后台URL
                         $admin_url[] = $admin_url;
                     }
                 }
             }
             if ($item['url']) {
                 if (!is_array($item['url'])) {
                     $item['url'] = array($item['url']);
                 }
                 foreach ($item['url'] as $url) {
                     if (($path_info = $get_path_info($url)) != false) {
                         self::$project = $project;
                         self::$path_info = $path_info;
                         self::$base_url = $url;
                         if ($admin_url) {
                             foreach ($admin_url as $url2) {
                                 # 处理后台URL不是 http:// 或 https:// 开头的形式
                                 if (($path_info_admin = $get_path_info($url2)) != false) {
                                     self::$path_info = $path_info_admin;
                                     self::$base_url .= ltrim($url2, '/');
                                     $request_mode = 'admin';
                                     break 3;
                                 }
                             }
                         }
                         break 2;
                     }
                 }
             }
         }
     }
     if (self::$project) {
         $project_dir = DIR_PROJECT . self::$project . DS;
         if (!is_dir($project_dir)) {
             self::show_error('not found the project: :project', array(':project' => self::$project));
         }
         # 根据URL寻找到了项目
         self::$include_path = array_merge(array('\\project\\' . self::$project . '\\' => $project_dir), self::$include_path);
     } else {
         if (isset(self::$config['core']['url']['admin']) && self::$config['core']['url']['admin'] && ($path_info = $get_path_info(self::$config['core']['url']['admin'])) != false) {
             self::$path_info = $path_info;
             self::$base_url = self::$config['core']['url']['admin'];
             $request_mode = 'admin';
         } else {
             if (isset(self::$config['core']['apps_url']) && is_array(self::$config['core']['apps_url']) && self::$config['core']['apps_url']) {
                 foreach (self::$config['core']['apps_url'] as $app => $urls) {
                     if (!$urls) {
                         continue;
                     }
                     if (!preg_match('#^[a-z0-9_]+//[a-z0-9]+$#i', $app)) {
                         continue;
                     }
                     if (!is_array($urls)) {
                         $urls = array($urls);
                     }
                     foreach ($urls as $url) {
                         if (($path_info = $get_path_info($url)) != false) {
                             self::$app = $app;
                             self::$path_info = $path_info;
                             self::$base_url = $url;
                             break 2;
                         }
                     }
                 }
             }
             if (null === self::$app) {
                 # 没有相关应用
                 if (isset(self::$config['core']['url']['apps']) && self::$config['core']['url']['apps']) {
                     if (($path_info = $get_path_info(self::$config['core']['url']['apps'])) != false) {
                         # 匹配到应用默认目录
                         $path_info = trim($path_info, '/');
                         self::$app = true;
                         if ($path_info) {
                             $path_info_arr = explode('/', $path_info);
                             if (count($path_info_arr) >= 2) {
                                 $app = array_shift($path_info_arr) . '/' . array_shift($path_info_arr);
                                 if (preg_match('#^[a-z0-9_]+//[a-z0-9]+$#i', $app)) {
                                     $path_info = '/' . implode('/', $path_info_arr);
                                     self::$app = $app;
                                 }
                             }
                         }
                         self::$path_info = $path_info;
                         self::$base_url = self::$config['core']['url']['apps'];
                         $request_mode = 'app';
                     }
                 }
             }
             if (self::$app && true !== self::$app) {
                 # 已获取到APP
                 $app_dir = DIR_APPS . self::$app . DS;
                 if (!is_dir($app_dir)) {
                     self::show_error('can not found the app: :app', array(':app' => self::$app));
                 }
                 $request_mode = 'app';
             }
         }
     }
 }
Ejemplo n.º 2
0
 /**
  * 根据URL初始化
  */
 private static function setup_by_url(&$request_mode)
 {
     # 当没有$_SERVER["SCRIPT_URL"] 时拼接起来
     if (!isset($_SERVER['SCRIPT_URL'])) {
         $tmp_uri = explode('?', $_SERVER['REQUEST_URI'], 2);
         $_SERVER['SCRIPT_URL'] = $tmp_uri[0];
     }
     # 处理BASE_URL
     if (isset(self::$core_config['root_path']) && self::$core_config['root_path']) {
         self::$base_url = rtrim(self::$core_config['root_path'], '/');
     } else {
         if (null === self::$base_url && isset($_SERVER["SCRIPT_NAME"]) && $_SERVER["SCRIPT_NAME"]) {
             $base_url_len = strrpos($_SERVER["SCRIPT_NAME"], '/');
             if (false !== $base_url_len) {
                 $base_url_len += 1;
                 # 截取到最后一个/的位置
                 $base_url = substr($_SERVER["SCRIPT_NAME"], 0, $base_url_len);
                 if (preg_match('#^(.*)/wwwroot/$#', $base_url, $m)) {
                     # 特殊处理wwwroot目录
                     $base_url = $m[1] . '/';
                     $base_url_len = strlen($base_url);
                 }
                 if (strtolower(substr($_SERVER['REQUEST_URI'], 0, $base_url_len)) == strtolower($base_url)) {
                     self::$base_url = $base_url;
                 }
             }
         }
     }
     # 当没有$_SERVER["SCRIPT_URI"] 时拼接起来
     if (!isset($_SERVER['SCRIPT_URI'])) {
         $_SERVER['SCRIPT_URI'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . (isset($_SERVER['SCRIPT_URL']) ? $_SERVER['SCRIPT_URL'] : $_SERVER["REQUEST_URI"]);
     }
     if (isset($_SERVER['PATH_INFO'])) {
         if (substr($_SERVER['PATH_INFO'], 0, 9) === '/wwwroot/') {
             $pathinfo = substr($_SERVER['PATH_INFO'], 8);
         } else {
             $pathinfo = $_SERVER['PATH_INFO'];
         }
     } else {
         if (isset($_SERVER['REQUEST_URI'])) {
             $request_uri = str_replace('\\', '/', $_SERVER['REQUEST_URI']);
             $root_uri = '/' . ltrim(str_replace('\\', '/', substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']))), '/');
             $index_file = 'index' . EXT;
             if (substr($root_uri, -strlen($index_file)) == $index_file) {
                 $root_uri = substr($root_uri, 0, -strlen($index_file));
             }
             if ($root_uri && $root_uri != '/') {
                 $request_uri = substr($request_uri, strlen($root_uri));
             }
             list($pathinfo) = explode('?', $request_uri, 2);
             $pathinfo = '/' . ltrim($pathinfo, '/');
         } elseif (isset($_SERVER['PHP_SELF'])) {
             $pathinfo = $_SERVER['PHP_SELF'];
         } elseif (isset($_SERVER['REDIRECT_URL'])) {
             $pathinfo = $_SERVER['REDIRECT_URL'];
         } else {
             $pathinfo = false;
         }
     }
     # 过滤pathinfo传入进来的服务器默认页
     if (false !== $pathinfo && ($indexpagelen = strlen(self::$core_config['server_index_page'])) && substr($pathinfo, -1 - $indexpagelen) == '/' . self::$core_config['server_index_page']) {
         $pathinfo = substr($pathinfo, 0, -$indexpagelen);
     }
     $pathinfo = trim($pathinfo);
     if (!isset($_SERVER["PATH_INFO"])) {
         $_SERVER["PATH_INFO"] = $pathinfo;
     }
     self::$path_info = $pathinfo;
     # 处理项目
     foreach (self::$core_config['projects'] as $project => $item) {
         if (!preg_match('#^[a-z0-9_]+$#i', $project)) {
             continue;
         }
         $rest_url = array();
         $admin_url = array();
         if (isset($item['dir']) && $item['dir']) {
             $project_dir = $item['dir'];
         } else {
             $project_dir = $project;
         }
         if (isset($item['url_rest']) && $item['url_rest']) {
             foreach ((array) $item['url_rest'] as $tmp_url) {
                 if (preg_match('#^http(s)?\\://#i', $tmp_url)) {
                     if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false) {
                         self::$project = $project;
                         self::$project_dir = $project_dir;
                         self::$path_info = $url_path_info;
                         self::$base_url = $tmp_url;
                         $request_mode = 'rest';
                         break 2;
                     }
                 } else {
                     # /开头的后台URL
                     $rest_url[] = $tmp_url;
                 }
             }
         }
         if (isset($item['url_admin']) && $item['url_admin']) {
             foreach ((array) $item['url_admin'] as $tmp_url) {
                 if (preg_match('#^http(s)?\\://#i', $tmp_url)) {
                     if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false) {
                         self::$project = $project;
                         self::$project_dir = $project_dir;
                         self::$path_info = $url_path_info;
                         self::$base_url = $tmp_url;
                         $request_mode = 'admin';
                         break 2;
                     }
                 } else {
                     # /开头的后台URL
                     $admin_url[] = $tmp_url;
                 }
             }
         }
         if ($item['url']) {
             foreach ((array) $item['url'] as $url) {
                 if (($path_info = self::_get_pathinfo($url)) !== false) {
                     self::$project = $project;
                     self::$project_dir = $project_dir;
                     self::$path_info = $path_info;
                     self::$base_url = $url;
                     if ($rest_url) {
                         foreach ($rest_url as $tmp_url) {
                             # 处理后台URL不是 http:// 或 https:// 开头的形式
                             if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false) {
                                 self::$path_info = $url_path_info;
                                 self::$base_url .= ltrim($tmp_url, '/');
                                 $request_mode = 'rest';
                                 break 3;
                             }
                         }
                     }
                     if ($admin_url) {
                         foreach ($admin_url as $tmp_url) {
                             # 处理后台URL不是 http:// 或 https:// 开头的形式
                             if (($url_path_info = self::_get_pathinfo($tmp_url)) !== false) {
                                 self::$path_info = $url_path_info;
                                 self::$base_url .= ltrim($tmp_url, '/');
                                 $request_mode = 'admin';
                                 break 3;
                             }
                         }
                     }
                     break 2;
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * 设置项目
  * 可重新设置新项目已实现程序内项目切换,但需谨慎使用
  * @param string $project
  */
 public static function set_project($project)
 {
     if (self::$project == $project) {
         return true;
     }
     static $core_config = null;
     if (null === $core_config) {
         # 记录原始Core配置
         $core_config = self::$config['core'];
     }
     if (!isset($core_config['projects'][$project])) {
         self::_throw_sys_error_msg(__('not found the project: :project.', array(':project' => $project)));
     }
     if (!$core_config['projects'][$project]['isuse']) {
         self::_throw_sys_error_msg(__('the project: :project is not open.', array(':project' => '$project')));
     }
     # 获取core里项目配置
     $project_config = $core_config['projects'][$project];
     # 项目路径
     $project_dir = realpath(DIR_PROJECT . $project_config['dir']);
     if (!$project_dir || !is_dir($project_dir)) {
         self::_throw_sys_error_msg(__('the project dir :dir is not exist.', array(':dir' => $project_config['dir'])));
     }
     $project_dir .= DS;
     self::$project_dir = $project_dir;
     # 记录所有项目设置,当切换回项目时,使用此设置还原
     static $all_prjects_setting = array();
     if (self::$project) {
         # 记录上一个项目设置
         $all_prjects_setting[self::$project] = array('config' => self::$config, 'project_config' => self::$project_config, 'include_path' => self::$include_path, 'file_list' => self::$file_list);
     }
     # 设为当前项目
     self::$project = $project;
     # 记录debug信息
     if (class_exists('Core', false)) {
         Core::debug()->info('程序已切换到了新项目:' . $project);
     }
     if (isset($all_prjects_setting[$project])) {
         # 还原配置
         self::$config = $all_prjects_setting[$project]['config'];
         self::$project_config = $all_prjects_setting[$project]['project_config'];
         self::$include_path = $all_prjects_setting[$project]['include_path'];
         self::$file_list = $all_prjects_setting[$project]['file_list'];
     } else {
         # 合并配置
         $config = $core_config['projects'][$project] + self::$config['core'];
         # 读取项目配置
         if (is_file($project_dir . 'config' . EXT)) {
             self::_include_config_file($config, $project_dir . 'config' . EXT);
         }
         # 读取DEBUG配置
         if (isset(self::$config['core']['debug_config']) && self::$config['core']['debug_config'] && is_file($project_dir . 'debug.config' . EXT)) {
             self::_include_config_file($config, $project_dir . 'debug.config' . EXT);
         }
         # 清理项目配置
         self::$project_config = $config;
         self::$config = array('core' => &self::$project_config);
         unset($config);
         # Builder构建,处理 self::$file_list
         if (self::$project_config['use_bulider'] === 'auto') {
             if (IS_DEBUG) {
                 $usebulider = false;
             } else {
                 $usebulider = true;
             }
         } else {
             $usebulider = (bool) self::$project_config['use_bulider'];
         }
         $project_filelist = DIR_BULIDER . self::$project . DS . 'project_all_files_list' . EXT;
         if (true === $usebulider && !IS_CLI && is_file($project_filelist)) {
             # 读取文件列表
             self::_include_config_file(self::$file_list, $project_filelist);
         }
         # 设置包含目录
         self::$include_path = self::get_project_include_path($project);
     }
     if (isset(self::$project_config['error_reporting'])) {
         error_reporting(self::$project_config['error_reporting']);
     }
     # 时区设置
     if (isset(self::$project_config['timezone'])) {
         date_default_timezone_set(self::$project_config['timezone']);
     }
     if (class_exists('Core', false)) {
         # 输出调试信息
         if (IS_DEBUG) {
             Core::debug()->group('当前加载目录');
             foreach (self::$include_path as $value) {
                 Core::debug()->log(Core::debug_path($value));
             }
             Core::debug()->groupEnd();
         }
         Core::ini_library();
     }
 }