# ThinkPHP5實現安裝程序
**install.php**
- `public/install.php`
> 首先在`thinkphp5`框架下的入口文件`index.php`,加入如下判斷
```
// 1.判斷當前 php 版本
if (version_compare(PHP_VERSION,'5.6','<')) die('require PHP > 5.6');
// 判斷是否安裝 后面的地址隨便你,你愿意扔那里就扔哪里
if (!is_file(APP_PATH . 'admin/command/Install/install.lock'))
{
// 這個地址也是你的install.php 文件在那里就指向那哪里
header("location:./install.php");
exit;
}
```
> 其次在`install.php`進行詳細代碼
- 定義站點名稱
```php
$sitename = "Your sitename"
```
- 定義報錯信息
```
$errInfo = '';
```
- 定義目錄分隔符
```
define('DS', DIRECTORY_SEPARATOR)
```
- 定義根目錄
```
define('ROOT_PATH', __DIR__ . DS . '..' . DS);
```
- 定義應用目錄
```
define('APP_PATH', ROOT_PATH . 'application' . DS);
```
- 定義安裝包目錄(你的在哪里就定義在哪里)
```
define('INSTALL_PATH', APP_PATH . 'admin' . DS . 'command' . DS . 'Install' . DS);
```
- 判斷文件是否有寫的權限
```
function is_really_writable($file)
{
if (DIRECTORY_SEPARATOR == '/' AND @ ini_get("safe_mode") == false) {
return is_writable($file);
}
if (!is_file($file) OR ($fp = @fopen($file, "r+")) === false) {
return false;
}
fclose($fp);
return true;
}
```
- 檢測關鍵目錄是否存在
```
$checkDirs = [
'thinkphp',
'vendor',
'public' . DS . 'assets' . DS . 'libs'
];
```
- 緩存目錄
```
$runtimeDir = APP_PATH . 'runtime';
```
- 數據庫配置文件
- thinkphp 5.0
```
$dbConfigFile = APP_PATH . 'database.php';
```
- thinkphp 5.1 config目錄下的 `database.php`配置文件
```
$dbConfigFile = 'config' . 'database.php';
```
- 鎖定的文件
```
// 鎖定的文件
$lockFile = INSTALL_PATH . 'install.lock';
if (is_file($lockFile)) {
$errInfo = "當前已經安裝{$sitename},如果需要重新安裝,請手動移除application/admin/command/Install/install.lock文件";
} else {
if (version_compare(PHP_VERSION, '5.5.0', '<')) {
$errInfo = "當前版本(" . PHP_VERSION . ")過低,請使用PHP5.5以上版本";
} else {
if (!extension_loaded("PDO")) {
$errInfo = "當前未開啟PDO,無法進行安裝";
} else {
if (!is_really_writable($dbConfigFile)) {
$open_basedir = ini_get('open_basedir');
if ($open_basedir) {
$dirArr = explode(PATH_SEPARATOR, $open_basedir);
if ($dirArr && in_array(__DIR__, $dirArr)) {
$errInfo = '當前服務器因配置了open_basedir,導致無法讀取父目錄<br><a href="https://forum.fastadmin.net/thread/1145?ref=install" target="_blank">點擊查看解決辦法</a>';
}
}
if (!$errInfo) {
$errInfo = '當前權限不足,無法寫入配置文件application/database.php<br><a href="https://forum.fastadmin.net/thread/1145?ref=install" target="_blank">點擊查看解決辦法</a>';
}
} else {
$dirArr = [];
foreach ($checkDirs as $k => $v) {
if (!is_dir(ROOT_PATH . $v)) {
$errInfo = '當前代碼僅包含核心代碼,請composer install';
break;
}
}
}
}
}
}
```
- 當前`post`請求
```
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
if ($errInfo) {
echo $errInfo;
exit;
}
$err = '';
$mysqlHostname = isset($_POST['mysqlHost']) ? $_POST['mysqlHost'] : '127.0.0.1';
$mysqlHostport = isset($_POST['mysqlHostport']) ? $_POST['mysqlHostport'] : 3306;
$hostArr = explode(':', $mysqlHostname);
if (count($hostArr) > 1) {
$mysqlHostname = $hostArr[0];
$mysqlHostport = $hostArr[1];
}
$mysqlUsername = isset($_POST['mysqlUsername']) ? $_POST['mysqlUsername'] : 'root';
$mysqlPassword = isset($_POST['mysqlPassword']) ? $_POST['mysqlPassword'] : '';
$mysqlDatabase = isset($_POST['mysqlDatabase']) ? $_POST['mysqlDatabase'] : 'fastadmin';
$mysqlPrefix = isset($_POST['mysqlPrefix']) ? $_POST['mysqlPrefix'] : 'fa_';
$adminUsername = isset($_POST['adminUsername']) ? $_POST['adminUsername'] : 'admin';
$adminPassword = isset($_POST['adminPassword']) ? $_POST['adminPassword'] : '123456';
$adminPasswordConfirmation = isset($_POST['adminPasswordConfirmation']) ? $_POST['adminPasswordConfirmation'] : '123456';
$adminEmail = isset($_POST['adminEmail']) ? $_POST['adminEmail'] : 'admin@admin.com';
if (!preg_match("/^\w{3,12}$/", $adminUsername)) {
echo "用戶名只能由3-12位數字、字母、下劃線組合";
exit;
}
if (!preg_match("/^[\S]{6,16}$/", $adminPassword)) {
echo "密碼長度必須在6-16位之間,不能包含空格";
exit;
}
if ($adminPassword !== $adminPasswordConfirmation) {
echo "兩次輸入的密碼不一致";
exit;
}
try {
//檢測能否讀取安裝文件
$sql = @file_get_contents(INSTALL_PATH . 'fastadmin.sql');
if (!$sql) {
throw new Exception("無法讀取application/admin/command/Install/fastadmin.sql文件,請檢查是否有讀權限");
}
$sql = str_replace("`fa_", "`{$mysqlPrefix}", $sql);
$pdo = new PDO("mysql:host={$mysqlHostname};port={$mysqlHostport}", $mysqlUsername, $mysqlPassword, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
//檢測是否支持innodb存儲引擎
$pdoStatement = $pdo->query("SHOW VARIABLES LIKE 'innodb_version'");
$result = $pdoStatement->fetch();
if (!$result) {
throw new Exception("當前數據庫不支持innodb存儲引擎,請開啟后再重新嘗試安裝");
}
$pdo->query("CREATE DATABASE IF NOT EXISTS `{$mysqlDatabase}` CHARACTER SET utf8 COLLATE utf8_general_ci;");
$pdo->query("USE `{$mysqlDatabase}`");
$pdo->exec($sql);
$config = @file_get_contents($dbConfigFile);
$callback = function ($matches) use ($mysqlHostname, $mysqlHostport, $mysqlUsername, $mysqlPassword, $mysqlDatabase, $mysqlPrefix) {
$field = ucfirst($matches[1]);
$replace = ${"mysql{$field}"};
if ($matches[1] == 'hostport' && $mysqlHostport == 3306) {
$replace = '';
}
return "'{$matches[1]}'{$matches[2]}=>{$matches[3]}Env::get('database.{$matches[1]}', '{$replace}'),";
};
$config = preg_replace_callback("/'(hostname|database|username|password|hostport|prefix)'(\s+)=>(\s+)Env::get\((.*)\)\,/", $callback, $config);
//檢測能否成功寫入數據庫配置
$result = @file_put_contents($dbConfigFile, $config);
if (!$result) {
throw new Exception("無法寫入數據庫信息到application/database.php文件,請檢查是否有寫權限");
}
//檢測能否成功寫入lock文件
$result = @file_put_contents($lockFile, 1);
if (!$result) {
throw new Exception("無法寫入安裝鎖定到application/admin/command/Install/install.lock文件,請檢查是否有寫權限");
}
$newSalt = substr(md5(uniqid(true)), 0, 6);
$newPassword = md5(md5($adminPassword) . $newSalt);
$pdo->query("UPDATE {$mysqlPrefix}admin SET username = '{$adminUsername}', email = '{$adminEmail}',password = '{$newPassword}', salt = '{$newSalt}' WHERE username = 'admin'");
$adminName = '';
if (is_file($adminFile)) {
$x = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$adminName = substr(str_shuffle(str_repeat($x, ceil(10 / strlen($x)))), 1, 10) . '.php';
rename($adminFile, ROOT_PATH . 'public' . DS . $adminName);
}
echo "success|{$adminName}";
} catch (PDOException $e) {
$err = $e->getMessage();
} catch (Exception $e) {
$err = $e->getMessage();
}
echo $err;
exit;
}
```
> 下面是一些顯示的安裝頁面,頁面內容,自己根據`html`和`css`能力部署頁面
- PHP獲取客戶端瀏覽器信息和版本
- PHP獲取客戶端操作系統信息
- 無限級分類
- git使用
- 權限檢測思路
- Vue學習
- 遇到的一些問題
- PHP的編碼思維和技巧
- mysql復習
- tp5
- ThinkPHP5.x 公共函數
- TP5登錄注冊
- TP5使用模板繼承
- ThinkPHP5.1 清除緩存
- thinkphp5實現安裝程序
- 安全
- tp中實現跨域代碼
- ThinkPHP5.1配合pjax實現菜單欄無刷新跳轉
- 獲取數據庫版本和數據庫大小
- 模型的基本CURD操作
- 商品spu
- 全局異常處理類
- ExceptionHandler
- BaseException
- PHP函數之error_reporting(E_ALL ^ E_NOTICE)詳細說明
- 微信小程序
- wx:for
- tp6
- 分離的一些模塊
- session開啟
- Spring
- 依賴注入
- 數據結構
- 二叉樹
- js獲取地址欄變量
- PHP設計模式
- 面向對象
- PHP1
- PHP性能優化
- Java學習
- static關鍵字
- 多態
- 接口、階乘
- 大佬給的面試題
- 訪問量為5000萬的博客系統設計
- PHP可變參數
- Nginx的配置案例
- 求數組中的最大值,并返回數組索引
- PHP面試方向
- PHP數組工具類ArrUtil
- 字符串工具類StrUtil
- PHP使用curl發送請求
- mysql
- PHP上傳base64圖片處理函數
- webstorm小程序常用配置
- 郵箱正則表達式
- leetcode mysql記錄
- 函數庫