define('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : preg_replace("/(.*)/.php(.*)/i", "//1.php", $_SERVER['PHP_SELF'])); /*先來研究這一句*/ /* $_SERVER['SCRIPT_NAME'] 執行的腳本名字(eg:/install.php) (.*) "." 匹配除了換行符以外的任意字符,* 表示重複零次或更多次,所以這個就表示 除換行以外的任意字符(串) /. 匹配 "." /i 使正則表達式對大小寫不敏感, /s 開啓“單行模式”,即點號“.”匹配新行符 /m 開啓“多行模式”,即“^”和“$”匹配新行符的前面和後面的位置。 如果你在正則表達式內部插入修飾符(?ism),則該修飾符只對其右邊的正則表達式起作用。(?-i)是關閉大小寫不敏感。 你可以很快的進行測試。/(?i)te(?-i)st/應該匹配TEst,但是不能匹配teST或TEST. //1 表示第一個子模式(也就是第一個括號裏匹配的字符) 這一句的意思就是:如果定義了$_SERVER['SCRIPT_NAME']就把形如 string.phpabcd... 的腳本名字換成 string.php */ define('QUERY_STRING', $_SERVER['QUERY_STRING']); /*$_SERVER['QUERY_STRING'] 地址 ?號 後面的一字符串*/ define('PATH_INFO', isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''); /*index.php/a/b 表示後面的 /a/b */ define('DOMAIN', isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : preg_replace("/([^:]*)[:0-9]*/i", "//1", $_SERVER['HTTP_HOST'])); /*服務器名*/ define('SCHEME', $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'); /*如果 端口是443 就用https通信 */ define('SITE_URL', SCHEME.$_SERVER['HTTP_HOST'].PHPCMS_PATH); /*設定 網站的URL */ define('RELATE_URL', isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : SCRIPT_NAME.(QUERY_STRING ? '?'.QUERY_STRING : PATH_INFO)); /*客戶端請求URL*/ define('URL', SCHEME.$_SERVER['HTTP_HOST'].RELATE_URL); define('SKIN_PATH', 'templates/default/skins/default/phpcms'); /*網站外觀路徑*/
$siteUrl = SCHEME.dirname($_SERVER['HTTP_HOST'].$_SERVER["SCRIPT_NAME"]);//網站地址 //addslashes處理請求參數 if($_REQUEST) { if(!MAGIC_QUOTES_GPC) { $_REQUEST = new_addslashes($_REQUEST); if($_COOKIE) $_COOKIE = new_addslashes($_COOKIE); } extract($_REQUEST, EXTR_SKIP); } header('Content-type: text/html; charset='.CHARSET);//設置網站字符集 $steps = include PHPCMS_ROOT.'install/step.inc.php';//安裝步驟 if(!isset($step)) $step = '1'; //判斷系統爲 win 還是 unix if(strrpos(strtolower(PHP_OS),"win") === FALSE) { define('ISUNIX', TRUE); } else { define('ISUNIX', FALSE); } $mode = 0777;//用戶讀寫權限 //路由操作到指定的執行程序 switch($step) { case '1': //安裝須知 include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '2': //許可協議 $license = file_get_contents(PHPCMS_ROOT."install/license.txt"); include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '3': //環境檢測 (FTP帳號設置) $PHP_GD = ''; if(extension_loaded('gd')) { if(function_exists('imagepng')) $PHP_GD .= 'png'; if(function_exists('imagejpeg')) $PHP_GD .= ' jpg'; if(function_exists('imagegif')) $PHP_GD .= ' gif'; } $PHP_DNS = preg_match("/^[0-9.]{7,15}$/", @gethostbyname('www.phpcms.cn')) ? 1 : 0; //是否滿足phpcms安裝需求 $is_right = (phpversion() >= '4.3.0' && extension_loaded('mysql') && ini_get('short_open_tag')) ? 1 : 0; include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '4': //選擇安裝模塊 require PHPCMS_ROOT.'/install/modules.inc.php'; include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '5': //設置目錄屬性 $selectmod = isset($selectmod) ? ','.implode(',', $selectmod) : ''; $selectmod = 'phpcms,member,pay'.$selectmod; $selectmods = explode(',',$selectmod); $selectmods = explode(',',$selectmod); foreach($selectmods AS $dir) { if($dir == 'phpcms') { $files = file(PHPCMS_ROOT."install/chmod.txt"); } else { $files = file(PHPCMS_ROOT.$dir."/install/chmod.txt"); } $files = array_filter($files); foreach($files as $file) { $file = str_replace('*','',$file); $file = trim($file); if(is_dir($file)) { $cname = '目錄'; } else { $cname = '文件'; } if(!is_writable(PHPCMS_ROOT.$file)) $no_writablefile .= $file.' '.$cname."不可寫<br>"; } } if(dir_create(PHPCMS_ROOT.'test_create_dir',0777)) { sleep(1); dir_delete(PHPCMS_ROOT.'test_create_dir'); } else { $no_writablefile = "網站根目錄不可寫<br>".$no_writablefile; } include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '6': //配置帳號 (MYSQL帳號、管理員帳號、) include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; case '7': //安裝詳細信息-完成安裝 include PHPCMS_ROOT."install/step".$step.".tpl.php"; break; ......
第一步判斷操作系統類型,顯示提示信息
<?php if(substr(PHP_OS, 0, 3) == 'WIN'){ ?> <ul> <li>第一步:使用ftp工具中的二進制模式將本軟件包裏的 phpcms 目錄上傳至服務器,假設上傳後目錄仍爲 phpcms;</li> <li>第二步:訪問 http://yourwebsite/phpcms/install.php 進入安裝程序,根據安裝嚮導提示完成安裝!</li> </ul> <?php }else{ ?> <ul> <li>第一步:使用ftp工具,將該軟件包裏的 upload 目錄及其文件上傳到您的空間,假設上傳後目錄仍舊爲 upload。</li> <li>第二步:先確認以下目錄或文件屬性爲 (777) 可寫模式。index.html,sitemaps.xml,sitemap.html,baidunews.xml,include/config.inc.php,about/*,data/*,templates/*,uploadfile/,languages/*</li> <li>第三步:運行 http://yourwebsite/upload/install.php 安裝程序,填入安裝相關信息與資料,完成安裝!</li> </ul> <?php } ?>
第二步:協議沒什麼說的
第三步:檢查環境和一些擴展是否打開
$PHP_GD = ''; if(extension_loaded('gd')) { if(function_exists('imagepng')) $PHP_GD .= 'png'; if(function_exists('imagejpeg')) $PHP_GD .= ' jpg'; if(function_exists('imagegif')) $PHP_GD .= ' gif'; } //現在還不明白 $PHP_DNS = preg_match("/^[0-9.]{7,15}$/", @gethostbyname('www.phpcms.cn')) ? 1 : 0; //是否滿足phpcms安裝需求:PHP的版本、mysql擴展是否打開、短標籤是否打開 $is_right = (phpversion() >= '4.3.0' && extension_loaded('mysql') && ini_get('short_open_tag')) ? 1 : 0;
第四步:模塊的選擇--PHP採用數組的形式把模塊組織起來
第五步:檢查要讀寫目錄是否可寫
$selectmod = isset($selectmod) ? ','.implode(',', $selectmod) : '';//獲取選擇的模塊 $selectmod = 'phpcms,member,pay'.$selectmod; $selectmods = explode(',',$selectmod);//把模塊割成數組 //循環模塊目錄,檢查是否可寫 foreach($selectmods AS $dir) { if($dir == 'phpcms') { $files = file(PHPCMS_ROOT."install/chmod.txt"); } else { $files = file(PHPCMS_ROOT.$dir."/install/chmod.txt"); } $files = array_filter($files); foreach($files as $file) { $file = str_replace('*','',$file); $file = trim($file); if(is_dir($file))//標記是目錄還是文件 { $cname = '目錄'; } else { $cname = '文件'; } if(!is_writable(PHPCMS_ROOT.$file)) $no_writablefile .= $file.' '.$cname."不可寫<br>";//如果不可寫則記錄,用於後面的顯示 } } //在根目錄下建立一個目錄,檢查根目錄是否可寫 if(dir_create(PHPCMS_ROOT.'test_create_dir',0777)) { sleep(1);//確保目錄建立完成 dir_delete(PHPCMS_ROOT.'test_create_dir'); } else { $no_writablefile = "網站根目錄不可寫<br>".$no_writablefile; }
第六步: