ThinkPHP6? ???? ?????? ?? ? ??? ???? ??
Jun 20, 2023 pm 07:25 PM???? ???? ???? ???? ??????? ?? ??? ?????. ??? ??????? ???? ???? ?? ?? ??? ?????. ? ????? ThinkPHP6 ?????? ?? ???? ThinkPHP6? ???? ?????? ?? ? ??? ???? ??? ?????.
1. ?????? ??
1.1 ?? ??
?????? ??? ???? ?? ?? ??? ???? ???.
1 mysql ??????? bin ???? ??? ???? ?? ??? ??? ??? ???? ???.
2. mysqldump ??? ??? ???? ???.
3. ??????? ?? ???? ??? ???? ????? ??????? ?? mysqldump ??? ??? ? ?? ??? ??? ?????.
1.2 ?????? ?? ??
1.2.1 ?? ???? ??
config ??? Database.php ??? ????, ??? ??? ?????? ?? ??? ????? ?????.
<?php return [ // 數據庫類型 'type' => 'mysql', // 數據庫連接DSN配置 'dsn' => '', // 服務器地址 'hostname' => 'localhost', // 數據庫名 'database' => 'test', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => 'root', // 數據庫連接端口 'hostport' => '3306', // 數據庫連接參數 'params' => [], // 數據庫編碼默認采用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'think_', // 數據庫調試模式 'debug' => false, // 數據庫備份路徑,沒有則自動創(chuàng)建 'path' => '', // 數據庫備份卷大小,單位為字節(jié),設為0表示不限制備份大小 'part' => 20971520, // 數據庫備份文件壓縮格式,這里是gzip 'compress' => 'gzip', // 數據庫備份文件名 'filename' => '', // 數據庫備份文件是否需要壓縮 'zip' => true, // 數據庫備份文件是否需要分卷備份 'split' => true, // 數據庫備份時是否將存儲過程和觸發(fā)器一起備份 'level' => 9, // 數據庫備份文件的存儲路徑,最好為絕對路徑,這也是最關鍵的路徑 'path' => '/data/mysql/', ];
1.2.2 ?? ?? ??
app/controller ??? BackupController.php ??? ???? ?? ??? ?????.
<?php declare(strict_types=1); namespace appcontroller; use thinkacadeDb; class BackupController { protected $backupConfig; public function __construct() { $this->backupConfig = config('database'); } public function backup() { // 防止備份數據過程超時 set_time_limit(0); $database = $this->backupConfig['database']; $filename = date('Ymd-His', time()) . ".sql"; $path = $this->backupConfig['path'].$filename; // 檢查目錄是否存在或者是否有權限寫入 if(!is_dir($this->backupConfig['path'])){ mkdir($this->backupConfig['path'], 0755, true); }else{ if(!is_writeable($this->backupConfig['path'])){ chmod($this->backupConfig['path'], 0755); } } // 備份所有數據表 $result = Db::query("SHOW TABLES"); $tables = array(); foreach($result as $index => $row){ $tables[] = $row['Tables_in_'.$database]; } // 備份所有表結構和表數據 $content = ''; foreach($tables as $table){ $content = $content . "/*" . PHP_EOL; $content = $content . "表名:" . $table . PHP_EOL; $content = $content . "表結構:" . PHP_EOL; $content = $content . "*/" . PHP_EOL; $content = $content . $this->backupTableSchema($table); $content = $content . "/*" . PHP_EOL; $content = $content . "表數據:" . PHP_EOL; $content = $content . "*/" . PHP_EOL; $content = $content . $this->buildInsertSql($table); } // 是否需要壓縮 if ($this->backupConfig['zip']) { $zip = new ZipArchive(); $zipfilename = $this->backupConfig['path'] . date('Ymd-His', time()) . ".zip"; if ($zip->open($zipfilename, ZipArchive::OVERWRITE) === TRUE) { $zip->addFile($path,$filename); $zip->close(); // 刪除非壓縮的文件 unlink($path); } else { // 備份失敗 } } } // 備份表結構 protected function backupTableSchema($table) { $database = $this->backupConfig['database']; $result = Db::query("SHOW CREATE TABLE `" . $table . "`"); $create = $result[0]['Create Table'] . ";" . PHP_EOL.PHP_EOL; return $create; } // 備份表數據 protected function buildInsertSql($table) { $database = $this->backupConfig['database']; $result = Db::query("SELECT * FROM `" . $table . "`"); $insert = ''; foreach ($result as $key => $value) { $keys = array_keys($value); $values = array_map(array(Db::class, 'quote'), array_values($value)); $values = join(",", $values); $insert .= "INSERT INTO `" . $table . "` (`" . join("`,`", $keys) . "`) VALUES (" . $values . ");" . PHP_EOL; } $insert .= PHP_EOL; return $insert; } }
1.2.3 ?? ??
??? ????? ????? ?? URL ??? ?????.
http://localhost/backup/backup
1.3 ?????? ??
1.3.1 ?? ?? ??
?/???? ??? RecoveryController.php ??? ???? ?? ??? ?????.
<?php declare(strict_types=1); namespace appcontroller; use thinkacadeDb; class RecoveryController { protected $backupConfig; public function __construct() { $this->backupConfig = config('database'); } public function recovery() { // 防止還原數據過程超時 set_time_limit(0); ini_set('memory_limit', '1024M'); $filename = input('get.filename'); // 讀取備份文件 if ($this->backupConfig['zip']) { $zip = new ZipArchive(); if ($zip->open($this->backupConfig['path'].$filename) === true) { $filename = $zip->getNameIndex(0); $zip->extractTo($this->backupConfig['path']); $zip->close(); } } $content = file_get_contents($this->backupConfig['path'] . $filename); // 使用";"分割內容 $statements = explode(";", $content); // 開始事務 Db::startTrans(); foreach ($statements as $index => $stmt) { if (trim($stmt) === '') { continue; } $results = Db::query($stmt); if ($results === false) { Db::rollback(); return false; } } // 提交事務 Db::commit(); // 刪除非壓縮的文件 unlink($this->backupConfig['path'] . $filename); return true; } }
1.3.2 ?? ??
??? ????? ????? ?? URL ??? ?????.
http://localhost/recovery/recovery?filename=20200101-121212.sql.zip
?? ThinkPHP6?? ?????? ?? ? ??? ???? ?????. ??? ?? ??? ??? ????? ??? ? ????. ??? ??? ????? ?? ???? ????? ???? ?? ?? ??????.
? ??? ThinkPHP6? ???? ?????? ?? ? ??? ???? ??? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

WeChat? ?? ? ??? ???? ??? ??? ?? ?? ??? ???? ?? ???? ??? ??? ?? ??? ????? ??? ???? ??? ???? ?????. ???? ?? ??: iPhone13 ???: iOS15.3 ??: WeChat 8.0.24 ?? 1 ?? WeChat? ?? ? ????? ?? ??? ?????. 2 ?? ?? ?? ????? ?? ??? ?? ?????. 3?? ????? ?? ??? ?????. 4 ?? ?? ?? ?? ????? ??? ?????. 5????? ??? ????? ??? ???? ???? ??? ???? ?????. ??: WeChat ??? ????? ?? ?? ?????. WeChat?? ?? ??? ???? ?? ?? WeChat ??? ? ?? WeChat ????? ?? ??? ????.

?? ?? ?? ????? ???? ??? ???? ???? ??? ? ?? ??? ???? ??? ? ?? ?? ??? ?????. ?? ?? ?? ???? ??? ????? ????? ?? ??? ????, ?? ? ?? ??? ????, ?? ?? ????? ????? ??? ??? ?? ?????. ??? ?? ??? ???? ??? ????? ?? ??? ???? ? ?? ????. ??, ?? ?? ?? ???? ??? ??? ?? ??? ???? ?? ??? ?????? ???? ??? ??? ?? ?? ???? ????. ??? ??? ????

ThinkPHP ????? ????? ??? ?????: Composer? ????, ???? ????? ???? php bin/console? ????, ?? ???? ??? http://localhost:8000? ?????.

???? ??? ??? ?? ??? ??? Douyin??? ???? ???? ???? ?? ? ?? ?? ???, ?? ??? ?? ???? ?? ?? ??? ? ? ????. ????? ?? ???? ? ??? ?? ?? ?? ??? ???? ??? ????, ?? ??? ?? ??? ?? ??? ??? ??? ?? ????. ??? ??? ?? ??? ?? ?? ???? ??? ? ????. ???? ?? ???? ????? ??? ?? ???? ? ???? ???? ?? ???? ??? ??? ??? ??? ??? ?? ??? ?????. Douyin ??? ??? ???? ??? ?????? 1. Douyin ??? ???? ?? ??? ??? ?????. 2. ?? ???? ??? ??? ????. 3. 3? ?? ????? ???? ??? ??? ??? ?? ? ????. 3? ??? ?? ???? ???? ?????

ThinkPHP?? ??? PHP ????? ??? ?? ??? ????. ??? ???? 3.2, 5.0, 5.1, 6.0? ????, ??? ??? ??? ???? ??? ??? ???? ? ?????. ?? ?? ??? ThinkPHP 6.0.16???. ??? ??? ? PHP ??, ?? ?? ?? ? ???? ??? ??????. ??? ??? ??? ???? ?? ?? ??? ???? ?? ????.

Xiaomi Cloud Photo Album? ??? ???? ?? Xiaomi Cloud Photo Album ??? Xiaomi Cloud Photo Album? ??? ??? ? ??? ???? ???? Xiaomi Cloud Photo Album? ??? ???? ??? ????. ???? ????? ???. ?? ??? ??? ????, ?? ?? ???? ?? ?????! Xiaomi ???? ?? ??? ??? ???? ?? 1. ?? Xiaomi ????? ?? ??? ?? ?? ??????? [?? ???]? ?????. 2. ?? ?? Xiaomi ?? ?????? ???? [???? ???] ??? ?????. Xiaomi? ?? ???? ??? ??? ?? [???? ??]? ?????. 4. ????? ??? ?? ??????? [???? ??]? ???? ??? ??? ?????.

ThinkPHP Framework? ???? ???? ??: ThinkPHP Framework? ?? ????? ?????? ??? ???. ThinkPHP ?? ????? ???? ?? ???(?? ??)? ????. ?????? ?? ????? ?????. ? ??? ?????. ThinkPHP ??????? ??????. ThinkPHP ?????? URL? ???? ?????.

Windows 10? 2019? 5? ????? ??? ? ?? ?? ?? ?? ??? ?????. ??? ?? ??? ?? ?? ????. Windows 10? ??? ??? ???? ?? ? ??? ??? ??? ? ????. ????? ?? ??? Windows 10??? ?? Windows 10 ?? ?? ??? ???????. ??? ??????? ?? Windows 10 PC?? ??? ???? ???. Microsoft ?? ??????? ? ?? ?? ???? ?? ? ??? ?? ???? ????? ? ????. Imgur?? 4K ???? ?? Windows 10 ?? ?? ?? ?? ??? ?????. ?? ?? ??? ? ?? ?? ?? ????.
