使用脚本自动部署Joomla站点是一个非常不错的功能,joomla中文网的在线试用功能就是基于这个技术来做到的,为了使被用户修改过的站点内容能够自动恢复到最初的状态,我们设置每隔30分钟就自动将网站重置一次。在这篇文章,我们将简单的谈一下如何实现这个功能。
自动部署joomla
能否做到使用代码来部署joomla站点呢?答案是肯定的。目前的方案有两种,一种是使用第三方工具joomlatools,这个工具可以允许我们通过命令行的方式来部署joomla.另外的一个方法就是自己写脚本来完成。在本文就主要介绍后者——如何通过写脚本来完成。
Joomla站点的部署原理
要部署joomla站点,首先得弄好其需要得运行环境,这个不在本文讨论。一个joomla站点主要有两个部分完成,文件代码和数据库。自动部署得核心任务就是如何通过代码将文件放到指定得目录,以及将数据库安装到对应得数据库里面去。最终通过修改configration.php文件,将数据库的链接信息告诉joomla,这样整个的部署就完成了。
在joomla中,分发的安装包主要有两种,一种是纯净的joomla安装包,另外一种是akeeba备份包,这两种包均包含了数据库和代码,也就是我们可以通过这个包完整的部署一个joomla站点出来。
具体的实现思路
joomla默认本身就自带有安装器,我们要做的事情相对来说比较简单。就是去阅读安装器的代码,将里面的页面交互去掉,将所有需要交互的内容通过参数传递的方式。如此这般,我们就可以使用脚本来自动部署。解压一个干净的joomla站点后,根目录里面有一个installation,在index.php里面可以看到具体的安装逻辑。整个的逻辑比较简洁,下面是我改进之后的版本。
<?php
/**
* @package Joomla.Installation
*
* @copyright Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
class zmaxAjaxData{
public $err;
public $data;
public function __construct()
{
$this->err = new stdclass();
$this->err->code = 0;
$this->err->msg = "";
$this->data = null;
}
public function setError($code,$msg)
{
$this->err->code = $code;
$this->err->msg = $msg;
}
public function setData($data)
{
$this->data = $data;
}
public function send()
{
if($this->err->code)
{
$this->err->errmsg='操作未完成,发生了错误.错误码:<b>'.$this->err->code.'</b>.错误信息:<b>'.$this->err->msg.'</b> <a target="_blank" title="错误码对应的解决方案" href="http://www.zmax99.com/errcodelist/'.$this->err->code.'">[参考的解决方案]</a>';
}
echo json_encode($this);
}
public function getAjaxInfo()
{
if($this->err->code)
{
$this->err->errmsg='操作未完成,发生了错误.错误码:<b>'.$this->err->code.'</b>.错误信息:<b>'.$this->err->msg.'</b> <a target="_blank" title="错误码对应的解决方案" href="http://www.zmax99.com/errcodelist/'.$this->err->code.'">[参考的解决方案]</a>';
}
return json_encode($this);
}
}
function makeRandom($length=8,$type="password")
{
$password = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
$name = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
$chars = $password;
if($type!="password")
{
$chars = $name;
}
$keys = array_rand($chars,$length);
$ret ='';
for($i=0;$i<$length;$i++)
{
$ret = $ret . $chars[ $keys[$i] ];
}
return $ret;
}
/**
* Define the application's minimum supported PHP version as a constant so it can be referenced within the application.
*/
define('JOOMLA_MINIMUM_PHP', '5.3.10');
if (version_compare(PHP_VERSION, JOOMLA_MINIMUM_PHP, '<'))
{
die('Your host needs to use PHP ' . JOOMLA_MINIMUM_PHP . ' or higher to run this version of Joomla!');
}
/**
* Constant that is checked in included files to prevent direct access.
* define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower
*/
define('_JEXEC', 1);
// Bootstrap the application
require_once __DIR__ . '/application/bootstrap.php';
$ajaxData = new zmaxAjaxData();
// Get the application
$app = JApplicationWeb::getInstance('InstallationApplicationWeb');
//开始得到POST参数
$siteName = $_POST["site_name"]?$_POST["site_name"]:"自动安装测试";
$dbUser = $_POST["db_user"];//数据库用户名
$dbName = $_POST["db_name"];//数据库名称
$dbHost = $_POST["db_host"];//数据库名称
$dbPassword = $_POST["db_password"];//数据库连接密码
if(!$dbName || !$dbUser)
{
$ajaxData->setError("DB_INFO_NOT_EMPTY","数据库名称/数据库用户名不能为空");
$ajaxData->send();
exit;
}
$username = "admin";
$password =makeRandom();
// 准备安装的参数
$cfg = array(
"db_created" => 1,
"site_name" => $siteName,
"admin_email" => "这个 E-mail 受反垃圾邮件程序保护,您需要启用 JavaScript 才能查看。",
"admin_user" => $username,
"site_metadesc" =>"" ,
"site_offline" => 0,
"language" => "zh-CN",
"admin_password_plain" => $password,
"helpurl" => "https://help.joomla.org/proxy?keyref=Help{major}{minor}:{keyref}&lang={langcode}",
"db_type" => "mysqli",
"db_host" => $dbHost,
"db_user" => $dbUser,
"db_name" => $dbName,
"db_old" => "backup",
"db_prefix" => "api_",
"db_pass_plain" => $dbPassword,
"db_select" => 1,
"summary_email" => 0,
"summary_email_passwords" => 0,
"sample_file" => "sample_data.sql"
);
try{
// 处理数据库
$db = new InstallationModelDatabase;
$return = $db->handleOldDatabase($cfg);
//创建新的数据库
$return = $db->createDatabase($cfg);
//安装CMS数据
$return = $db->installCmsData($cfg);
//安装示范数据
$return = $db->installSampleData($cfg);
// 创建配置文件
$config = new InstallationModelConfiguration();
$config->setup($cfg);
//删除安装目录
jimport("joomla.filesystem.folder");
$installFolder = __DIR__ ;
JFolder::delete($installFolder);
$user = new stdclass();
$user->name=$username;
$user->password =$password;
$user->url ="http://www.zmax99.com";
$ajaxData->setData($user);
$ajaxData->send();
exit;
}catch(Exception $err){
$ajaxData->setError("INSTALL_ERROR","安装错误");
$ajaxData->send();
exit;
}
通过上面的代码,就可以实现自动部署一个joomla站点了。对于基于akeeba的备份包修改逻辑也是一样。附件是我已经修改过的自动安装程序。
评论 (0)