帝国cms 自动安装脚本后跳转登录页面

真是累,每次安装测试帝国模板都需要手动删除install.lock文件,然后再下一步下一步!

下一步完成后,还需要你自己填写数据库和初始密码!

真是烦死了!

于是乎,我写了一个PHP,大致功能如下:

不用手动访问/e/install目录和删除lock文件

运行PHP,自动安装帝国cms,并且跳转帝国后台登录!

初始账号:admin

初始密码:123456

目前只适合帝国cms7.5,以后可能会增加帝国cms7.2

上代码:

<?php
$sql_name = "test_4s5_cn";
$sql_pass = "ggggggggggggg";
// 下载帝国安装包和配置文件
downloadAndExtract(__DIR__."/e/install/","http://api.4s5.cn/cdn/ecms/zip/install.zip");
downloadAndExtract(__DIR__."/e/config/","http://api.4s5.cn/cdn/ecms/zip/config.zip");
importSqlZip("http://api.4s5.cn/cdn/ecms/zip/mysql.sql.zip",$sql_name,$sql_name,$sql_pass);
// 配置数据库config文件
$config_file = __DIR__."/e/config/config.php";
modifyDatabaseConfig($config_file,['dbusername' => $sql_name, 'dbpassword' => $sql_pass, 'dbname' => $sql_name, 'dbtbpre' => "phome_"]);
// 安装install的数据库
// 获取当前域名
$domain = $_SERVER['HTTP_HOST'];
// 拼接 URL
$url = "http://{$domain}/e/admin";
// 跳转到 URL
header("Location: $url");




// 自定义函数
/**
 * 从远程URL下载包含SQL文件的ZIP压缩文件,解压缩SQL文件到指定目录,然后将数据导入到MySQL数据库中。
 *
 * @param string $remoteUrl 远程ZIP文件的URL地址
 * @param string $dbName 目标MySQL数据库的名称
 * @param string $dbUser 目标MySQL数据库的用户名
 * @param string $dbPass 目标MySQL数据库的密码
 * @param string $dbHost 目标MySQL数据库的主机地址,默认为localhost
 * @param string $sqlDir 解压缩SQL文件的目录路径,默认为当前文件所在目录下的path/目录
 * @throws Exception 如果下载、解压缩、数据库操作失败,则会抛出异常
 */
function importSqlZip($remoteUrl, $dbName, $dbUser, $dbPass, $dbHost = 'localhost', $sqlDir = __DIR__.'/path/') {
    // 创建一个临时文件用于保存下载的 Zip 文件
    $tempZip = tempnam(sys_get_temp_dir(), 'sql_zip_');

    // 下载远程 Zip 文件并保存到本地
    $fp = fopen($tempZip, 'w');
    $ch = curl_init($remoteUrl);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $success = curl_exec($ch);
    curl_close($ch);
    fclose($fp);

    if (!$success) {
        throw new Exception('Failed to download the remote SQL ZIP file.');
    }
    // 创建指定目录
    if (!mkdir($sqlDir, 0777, true)) {
        throw new Exception('Failed to create directory.');
    }

    // 解压缩文件到指定目录
    $zip = new ZipArchive();
    if ($zip->open($tempZip) === TRUE) {
        $zip->extractTo($sqlDir);
        $zip->close();
    } else {
        throw new Exception('Failed to extract the SQL ZIP file.');
    }

    // 清空数据库
    $dsn = "mysql:host=$dbHost;dbname=$dbName";
    $pdo = new PDO($dsn, $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
    foreach ($tables as $table) {
        $pdo->query("DROP TABLE IF EXISTS $table");
    }

    // 导入 SQL 文件
    $files = glob($sqlDir . '*.sql');
    foreach ($files as $file) {
        $pdo->exec(file_get_contents($file));
    }

    // 删除临时文件和 SQL 文件
    unlink($tempZip);
    $files = glob($sqlDir . '*.sql');
    foreach ($files as $file) {
        unlink($file);
    }
    rmdir($sqlDir);
}




function downloadAndExtract($installDir, $remoteZipUrl) {
    // 删除指定目录及其下所有文件
    if (is_dir($installDir)) {
        $files = glob($installDir . '/*');
        foreach ($files as $file) {
            if (is_file($file)) {
                unlink($file);
            } elseif (is_dir($file)) {
                $innerFiles = glob($file . '/*');
                foreach ($innerFiles as $innerFile) {
                    if (is_file($innerFile)) {
                        unlink($innerFile);
                    }
                }
                rmdir($file);
            }
        }
        rmdir($installDir);
    }

    // 创建指定目录
    if (!mkdir($installDir, 0777, true)) {
        throw new Exception('Failed to create install directory.');
    }

    // 下载远程 Zip 文件并保存到本地
    $tempZip = tempnam(sys_get_temp_dir(), 'download_');
    $fp = fopen($tempZip, 'w');
    $ch = curl_init($remoteZipUrl);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $success = curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    if (!$success) {
        throw new Exception('Failed to download the remote ZIP file.');
    }

    // 解压缩文件到指定目录
    $zip = new ZipArchive();
    if ($zip->open($tempZip) === TRUE) {
        $zip->extractTo($installDir);
        $zip->close();
    } else {
        throw new Exception('Failed to extract the ZIP file.');
    }

    // 删除临时文件
    unlink($tempZip);
}

// 读取数据库文件,然后传入需要替换的数组
function modifyDatabaseConfig($filename, $newConfig) {
  // 读取配置文件内容
  $file = file_get_contents($filename);
  // 替换配置内容
  
  // 配置文件里的变量名前缀
    $prefix = '$ecms_config[\'db\']';
    
    // 遍历新配置,将对应的变量替换为新值
    foreach ($newConfig as $key => $value) {
        $pattern = '/' . preg_quote($prefix) . '\[\'' . preg_quote($key) . '\'\]\s*=\s*\'[^;]+;/';
        $replace = $prefix . '[\'' . $key . '\'] = \'' . $value . '\';';
        $file = preg_replace($pattern, $replace, $file);
    }
  // 保存文件
  file_put_contents($filename, $file);
}

第二次更新

本次更新了帝国cms7.2版本的安装,运行PHP自动判断帝国版本,然后自动安装

<?php
$sql_name = "test_4s5_cn";
$sql_pass = "wnxxtJTa3y4SPPrr";

if(file_exists(__DIR__."/e/admin/index.php")){
    $string = file_get_contents(__DIR__."/e/admin/index.php");
    // 开始检查帝国cms版本
    if (strpos($myString, "7.2") !== false) {
        $ecms = 7.5;
    } else {
        $ecms = 7.2;
    }
}else{
    die("未检测到帝国admin后台");
}

// 下载帝国安装包和配置文件
downloadAndExtract(__DIR__."/e/install/","http://api.4s5.cn/cdn/ecms/zip/{$ecms}/install.zip");
downloadAndExtract(__DIR__."/e/config/","http://api.4s5.cn/cdn/ecms/zip/{$ecms}/config.zip");
importSqlZip("http://api.4s5.cn/cdn/ecms/zip/{$ecms}/mysql.sql.zip",$sql_name,$sql_name,$sql_pass);
// 配置数据库config文件
$config_file = __DIR__."/e/config/config.php";
modifyDatabaseConfig($config_file,['dbusername' => $sql_name, 'dbpassword' => $sql_pass, 'dbname' => $sql_name, 'dbtbpre' => "phome_"]);
// 获取当前域名
$domain = $_SERVER['HTTP_HOST'];
// 拼接 URL
$url = "http://{$domain}/e/admin";
echo "安装成功!帝国版本:{$ecms}";
// 停顿三秒钟后跳转后台
echo " <meta http-equiv=\"refresh\" content=\"3;url={$url}\" />";

// 自定义函数
/**
 * 从远程URL下载包含SQL文件的ZIP压缩文件,解压缩SQL文件到指定目录,然后将数据导入到MySQL数据库中。
 *
 * @param string $remoteUrl 远程ZIP文件的URL地址
 * @param string $dbName 目标MySQL数据库的名称
 * @param string $dbUser 目标MySQL数据库的用户名
 * @param string $dbPass 目标MySQL数据库的密码
 * @param string $dbHost 目标MySQL数据库的主机地址,默认为localhost
 * @param string $sqlDir 解压缩SQL文件的目录路径,默认为当前文件所在目录下的path/目录
 * @throws Exception 如果下载、解压缩、数据库操作失败,则会抛出异常
 */
function importSqlZip($remoteUrl, $dbName, $dbUser, $dbPass, $dbHost = 'localhost', $sqlDir = __DIR__.'/path/') {
    // 创建一个临时文件用于保存下载的 Zip 文件
    $tempZip = tempnam(sys_get_temp_dir(), 'sql_zip_');

    // 下载远程 Zip 文件并保存到本地
    $fp = fopen($tempZip, 'w');
    $ch = curl_init($remoteUrl);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $success = curl_exec($ch);
    curl_close($ch);
    fclose($fp);

    if (!$success) {
        throw new Exception('Failed to download the remote SQL ZIP file.');
    }
    // 创建指定目录
    if (!mkdir($sqlDir, 0777, true)) {
        throw new Exception('Failed to create directory.');
    }

    // 解压缩文件到指定目录
    $zip = new ZipArchive();
    if ($zip->open($tempZip) === TRUE) {
        $zip->extractTo($sqlDir);
        $zip->close();
    } else {
        throw new Exception('Failed to extract the SQL ZIP file.');
    }

    // 清空数据库
    $dsn = "mysql:host=$dbHost;dbname=$dbName";
    $pdo = new PDO($dsn, $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
    foreach ($tables as $table) {
        $pdo->query("DROP TABLE IF EXISTS $table");
    }

    // 导入 SQL 文件
    $files = glob($sqlDir . '*.sql');
    foreach ($files as $file) {
        $pdo->exec(file_get_contents($file));
    }

    // 删除临时文件和 SQL 文件
    unlink($tempZip);
    $files = glob($sqlDir . '*.sql');
    foreach ($files as $file) {
        unlink($file);
    }
    rmdir($sqlDir);
}




function downloadAndExtract($installDir, $remoteZipUrl) {
    // 删除指定目录及其下所有文件
    if (is_dir($installDir)) {
        $files = glob($installDir . '/*');
        foreach ($files as $file) {
            if (is_file($file)) {
                unlink($file);
            } elseif (is_dir($file)) {
                $innerFiles = glob($file . '/*');
                foreach ($innerFiles as $innerFile) {
                    if (is_file($innerFile)) {
                        unlink($innerFile);
                    }
                }
                rmdir($file);
            }
        }
        rmdir($installDir);
    }

    // 创建指定目录
    if (!mkdir($installDir, 0777, true)) {
        throw new Exception('Failed to create install directory.');
    }

    // 下载远程 Zip 文件并保存到本地
    $tempZip = tempnam(sys_get_temp_dir(), 'download_');
    $fp = fopen($tempZip, 'w');
    $ch = curl_init($remoteZipUrl);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    $success = curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    if (!$success) {
        throw new Exception('Failed to download the remote ZIP file.');
    }

    // 解压缩文件到指定目录
    $zip = new ZipArchive();
    if ($zip->open($tempZip) === TRUE) {
        $zip->extractTo($installDir);
        $zip->close();
    } else {
        throw new Exception('Failed to extract the ZIP file.');
    }

    // 删除临时文件
    unlink($tempZip);
}

// 读取数据库文件,然后传入需要替换的数组
function modifyDatabaseConfig($filename, $newConfig) {
  // 读取配置文件内容
  $file = file_get_contents($filename);
  // 替换配置内容
  
  // 配置文件里的变量名前缀
    $prefix = '$ecms_config[\'db\']';
    
    // 遍历新配置,将对应的变量替换为新值
    foreach ($newConfig as $key => $value) {
        $pattern = '/' . preg_quote($prefix) . '\[\'' . preg_quote($key) . '\'\]\s*=\s*\'[^;]+;/';
        $replace = $prefix . '[\'' . $key . '\'] = \'' . $value . '\';';
        $file = preg_replace($pattern, $replace, $file);
    }
  // 保存文件
  file_put_contents($filename, $file);
}
© 版权声明
THE END
喜欢就支持一下吧
点赞5
评论 抢沙发

请登录后发表评论

    暂无评论内容