今天,我们将探讨如何使用单个代码库在CodeIgniter Web框架中管理多个应用程序。 在此过程中,我们将继续创建两个不同的CodeIgniter应用程序,它们将共享核心CodeIgniter代码库。
在不同的应用程序之间共享核心代码库并不是什么新鲜事物,因为不同的框架和开放源代码系统已经在实践它,而CodeIgniter也不例外。 它使您可以轻松地管理共享核心CodeIgniter库和API文件的多个应用程序,同时可以使用不同的数据库和特定于站点的配置。
首先,我们将介绍多站点设置的好处,然后继续进行实际演示,以演示在CodeIgniter框架中设置多个应用程序所需要的工作。
多站点设置的好处
在本节中,我们将重点介绍进行多站点设置的一些好处。
我可以直接指出的最明显的好处之一是,多站点安装共享一个公共代码库,这将使应用程序的升级和维护过程变得更加容易。
例如,假设您有十个不同的CodeIgniter应用程序正在运行。 您刚知道可以使用新版本的CodeIgniter框架进行升级,并且您想尽快对其进行升级,以确保代码保持安全和稳定。
如果您为每个应用程序都有一个单独的代码库,那么遍历每个站点并依次对其进行升级绝对是一个繁琐的过程。 使用多站点设置,您只需要做一次,因为核心代码库已在所有站点之间共享!
接下来,它允许您为每个应用程序使用不同的数据库,即使它们共享相同的代码库。 实际上,这是设置多站点的最受欢迎的用例之一!
除了为每个应用程序使用不同的数据库之外,您还可以创建一个设置,该设置使用相同的数据库,但是前端使用不同的主题或布局。
如果您仍在使用基于FTP的方法在不同服务器之间移动站点文件,那么我想您会喜欢多站点方法,因为它可以最大程度地减少工作量!
如何创建多个应用程序
在本节中,我们将设置基本目录结构以实现多站点设置。
在您的CodeIgniter应用程序的根目录中,创建一个applications
目录。 这是存放我们不同应用程序的主目录。
接下来,继续创建两个新目录applications/app_one
和applications/app_two
。 当然,您可以按自己的方式命名,但现在我将保持简单。
因此,如您所见,我们将设置两个不同的应用程序,这些应用程序将使用CodeIgniter框架的单个代码库。 尽管多站点设置将重用大多数CodeIgniter框架文件,但我们仍然需要为我们创建的每个应用程序复制几个文件和目录。
首先让我快速列出您应从默认应用程序复制的文件和目录。
将以下目录从默认应用程序目录复制到applications/app_one
和applications/app_two
:
- 快取
- 配置
- 日志
如您所见,很明显,每个应用程序都有单独的目录用于cache
和logs
。 config
目录对于您的CodeIgniter应用程序的工作必不可少,因此无论如何我们将对其进行复制。
接下来,让我们复制几个文件以及必要的目录,以使我们能够测试多站点应用程序。
将以下文件从默认的CodeIgniter应用程序复制到我们的app_one
和app_two
应用程序:
- 控制器/welcome.php
- 查看/错误
- views / welcome_message.php
为了快速参考, controllers/welcome.php
文件应如下所示:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Welcome extends CI_Controller {
/**
* Index Page for this controller.
*
* Maps to the following URL
* https://example.com/index.php/welcome
* - or -
* http://example.com/index.php/welcome/index
* - or -
* Since this controller is set as the default controller in
* config/routes.php, it's displayed at http://example.com/
*
* So any other public methods not prefixed with an underscore will
* map to /index.php/welcome/<method_name>
* @see https://codeigniter.com/user_guide/general/urls.html
*/
public function index()
{
$this->load->view('welcome_message');
}
}
并且views/welcome_message.php
文件应该看起来像。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to CodeIgniter</title>
<style type="text/css">
::selection { background-color: #E13300; color: white; }
::-moz-selection { background-color: #E13300; color: white; }
body {
background-color: #fff;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #4F5155;
}
a {
color: #003399;
background-color: transparent;
font-weight: normal;
}
h1 {
color: #444;
background-color: transparent;
border-bottom: 1px solid #D0D0D0;
font-size: 19px;
font-weight: normal;
margin: 0 0 14px 0;
padding: 14px 15px 10px 15px;
}
code {
font-family: Consolas, Monaco, Courier New, Courier, monospace;
font-size: 12px;
background-color: #f9f9f9;
border: 1px solid #D0D0D0;
color: #002166;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}
#body {
margin: 0 15px 0 15px;
}
p.footer {
text-align: right;
font-size: 11px;
border-top: 1px solid #D0D0D0;
line-height: 32px;
padding: 0 10px 0 10px;
margin: 20px 0 0 0;
}
#container {
margin: 10px;
border: 1px solid #D0D0D0;
box-shadow: 0 0 8px #D0D0D0;
}
</style>
</head>
<body>
<div id="container">
<h1>Welcome to CodeIgniter! You're browsing Application One!</h1>
<div id="body">
<p>The page you are looking at is being generated dynamically by CodeIgniter.</p>
<p>If you would like to edit this page you'll find it located at:</p>
<code>application/views/welcome_message.php</code>
<p>The corresponding controller for this page is found at:</p>
<code>application/controllers/Welcome.php</code>
<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
</div>
<p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo (ENVIRONMENT === 'development') ? 'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>
</div>
</body>
</html>
当然,您应该在视图文件中更改以下消息,以便我们可以在测试期间区分应用程序。
对于applications/app_one/views/welcome_message.php
,它应类似于:
<h1>Welcome to CodeIgniter! You're browsing Application One!</h1>
对于applications/app_two/views/welcome_message.php
,它应该类似于:
<h1>Welcome to CodeIgniter! You're browsing Application Two!</h1>
现在,就我们的多站点设置而言,我们已完成所有工作。 但是,它仍无法立即使用,因为我们仍然需要通知CodeIgniter我们的多站点设置,因为它总是加载位于application
目录中的默认应用application
。
画龙点睛
让我们快速浏览一下配置默认应用程序目录的设置。 继续并在应用程序的根目录下打开index.php
文件,然后查找以下代码片段。
/*
*---------------------------------------------------------------
* APPLICATION DIRECTORY NAME
*---------------------------------------------------------------
*
* If you want this front controller to use a different "application"
* directory than the default one you can set its name here. The directory
* can also be renamed or relocated anywhere on your server. If you do,
* use an absolute (full) server path.
* For more info please see the user guide:
*
* https://codeigniter.com/user_guide/general/managing_apps.html
*
* NO TRAILING SLASH!
*/
$application_folder = 'application';
从上面的代码片段中可以很明显地看出,它允许您设置默认应用程序的路径。 因此,在这里我们可以进行更改,以便它从默认目录以外的目录中拾取默认应用程序。
当然,您可以继续并立即执行类似的操作,并且应该运行app_one
应用程序。
$application_folder = 'applications/app_one';
另一方面,如果要运行app_two
怎么app_two
? 作为一个快捷工具,您可以将每个应用程序的index.php
文件复制到index_app_one.php
和index_app_two.php
。 在虚拟主机中,确保进行相应的更改。
另一方面,我更喜欢略有不同的方法,并且我希望依靠ENV
变量在运行时在不同的应用程序之间进行选择。
例如,您可以在NGINX中设置自定义ENV
变量,如以下代码片段所示。
// set the env variable CI_DEFAULT_APP in the "location" directive of vhost
fastcgi_param CI_DEFAULT_APP applications/app_one;
如果您使用的是Apache Web服务器,则可以通过以下方法实现相同的目的:
SetEnv CI_DEFAULT_APP applications/app_one
接下来,让我们修改index.php
文件中的代码,该文件利用ENV
变量来确定要运行的默认应用程序。
...
...
$application_folder = (isset($_SERVER['CI_DEFAULT_APP']) ? $_SERVER['CI_DEFAULT_APP'] : 'application');
...
...
因此,正如您所看到的,我们首先检查CI_DEFAULT_APP
ENV
变量的存在,如果不可用,那么我们将使用默认应用程序。
通常,您想在不同的域上运行不同的应用程序。 理想情况下,我想为每个应用程序使用两个不同的虚拟主机。 在NGINX的上下文中,每个虚拟主机的快速示例应如下所示。
www.ci-app-one.com域指向app_one
:
server {
listen {YOUR_IP}:80;
server_name www.ci-app-one.com;
root /var/www/html;
index index.html index.php;
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
location / {
# Check if a file or directory index file exists, else route it to index.php.
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param CI_DEFAULT_APP applications/app_one;
include fastcgi_params;
}
}
同样, www.ci-app-two.com域指向app_two
:
server {
listen {YOUR_IP}:80;
server_name www.ci-app-two.com;
root /var/www/html;
index index.html index.php;
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}
location / {
# Check if a file or directory index file exists, else route it to index.php.
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param CI_DEFAULT_APP applications/app_two;
include fastcgi_params;
}
}
当然,您可以立即进行测试,以查看更改是否确实有效! 如果您遇到任何问题,请随时向我提出任何疑问。
这是非常简单的方法,您可以使用一个代码库在CodeIgniter框架中设置多个应用程序。
结论
今天,我们经历了CodeIgniter框架的一个有趣方面,它允许您使用单个代码库来管理多个应用程序。 这样做的明显好处是可以轻松升级和维护现有代码库。
CodeIgniter是功能强大的PHP平台。 无论您是刚入门还是要使用下一个版本,请不要忘记查看我们为您提供的服务 。
如果您已经实施了类似的方法,或者可能会以稍微不同的方式来实现,请分享您的想法。 无论哪种方式,我都想听听您的想法!
翻译自: https://code.tutsplus.com/tutorials/manage-multiple-applications-in-codeigniter--cms-29795