使用脚本自动部署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的备份包修改逻辑也是一样。附件是我已经修改过的自动安装程序。 

joomla_auto_starterv1.0.0_2025-10-22.zip

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前