Advertisement
  1. Code
  2. CodeIgniter

Как управлять несколькими приложениями в CodeIgniter

Scroll to top
Read Time: 9 min

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Сегодня мы рассмотрим, как вы можете управлять несколькими приложениями в веб-фреймворке CodeIgniter с использованием единой кодовой базы. В ходе этого мы продолжим работу и создадим два разных приложения CodeIgniter, которые будут совместно использовать общую кодовую базу CodeIgniter.

Совместное использование общей кодовой базы в разных приложениях не является чем-то новым, поскольку оно уже практикуется различными системами и системами с открытым исходным кодом, и CodeIgniter не является исключением. Он легко позволяет вам управлять несколькими приложениями, которые совместно используют основную библиотеку CodeIgniter и файлы API, и в то же время вы можете использовать разные базы данных и конфигурации сайтов.

Начнем с того, что мы воспользуемся преимуществами многосайтовой настройки, и по мере продвижения мы рассмотрим практическую демонстрацию того, что нужно для создания нескольких приложений в рамках CodeIgniter.

Преимущества многопосайтовой настройки

В этом разделе мы остановимся на нескольких преимуществах многоуровневой настройки.

Одна из самых очевидных преимуществ, которые я могу сразу отметить, заключается в том, что многоуровневая установка имеет общую кодовую базу, что значительно облегчит процесс обновления и обслуживания вашего приложения.

Например, давайте представим, что у вас есть десять различных приложений CodeIgniter, работающих под вашим поясом. И вы только узнали, что новая версия Framework CodeIgniter доступна для обновления, и вы хотели бы как можно быстрее обновить ее, чтобы убедиться, что код остается безопасным и стабильным.

Если у вас есть отдельная база кода для каждого из ваших приложений, то определенно будет утомительным процессом проходить через каждый сайт и обновлять его по очереди. Благодаря многоуровневой настройке вам просто нужно сделать это один раз, когда основная кодовая база будет доступна для всех сайтов!

Затем он позволяет использовать другую базу данных для каждого приложения, даже если они имеют общую базу кода. На самом деле, это один из самых популярных вариантов использования мультисайта!

Помимо использования другой базы данных для каждого приложения, вы можете создать установку, которая использует одну и ту же базу данных, но другую тему или макет в интерфейсе.

Если вы по-прежнему используете подход на основе FTP для перемещения файлов сайта на разных серверах, я бы сказал, что вам понравится многоуровневый подход, поскольку он в значительной степени минимизирует вашу работу!

Как создать несколько приложений

В этом разделе мы создадим базовую структуру каталогов, чтобы реализовать многоуровневую настройку.

В корне вашего приложения CodeIgniter создайте каталог applications. Это основной каталог, который будет содержать наши различные приложения.

Затем создайте два новых каталога: application/app_one и applications/app_two. Конечно, вы могли бы назвать его так, как хотите, но сейчас я все упрощу.

Итак, как вы можете видеть, мы собираемся настроить два разных приложения, которые будут использовать единую базу кода Framework CodeIgniter. Хотя многоузловая установка будет повторно использовать большинство файлов фреймворка CodeIgniter, нам по-прежнему нужно дублировать пару файлов и каталогов для каждого создаваемого нами приложения.

Позвольте мне быстро перечислить файлы и каталоги, которые вы должны скопировать из приложения по умолчанию в первую очередь.

Скопируйте следующие каталоги из каталога приложений по умолчанию в applications/app_one и applications/app_two:

  • cache
  • config
  • logs

Как вы можете видеть, очевидно, что для каждого приложения есть отдельные каталоги для cache и logs. И каталог config необходим для работы вашего приложения CodeIgniter, поэтому мы все равно его скопируем.

Затем скопируем несколько файлов вместе с необходимыми каталогами, которые позволят нам протестировать наше многоуровневое приложение.

Скопируйте следующие файлы в приложения app_one и app_two из приложения CodeIgniter по умолчанию:

  • controllers/welcome.php
  • views/errors
  • views/welcome_message.php

Для быстрой ссылки файл controller/welcome.php должен выглядеть следующим образом:

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
class Welcome extends CI_Controller { 
5
6
    /**

7
     * Index Page for this controller.

8
     *

9
     * Maps to the following URL

10
     *         https://example.com/index.php/welcome

11
     *    - or -

12
     *         http://example.com/index.php/welcome/index

13
     *    - or -

14
     * Since this controller is set as the default controller in

15
     * config/routes.php, it's displayed at http://example.com/

16
     *

17
     * So any other public methods not prefixed with an underscore will

18
     * map to /index.php/welcome/<method_name>

19
     * @see https://codeigniter.com/user_guide/general/urls.html

20
     */
21
    public function index()
22
    {
23
        $this->load->view('welcome_message');
24
    }
25
}

А так должен выглядеть файл views/welcome_message.php.

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
?><!DOCTYPE html>
4
<html lang="en">
5
<head>
6
    <meta charset="utf-8">
7
    <title>Welcome to CodeIgniter</title>
8
9
    <style type="text/css">
10
11
    ::selection { background-color: #E13300; color: white; }
12
    ::-moz-selection { background-color: #E13300; color: white; }
13
14
    body {
15
        background-color: #fff;
16
        margin: 40px;
17
        font: 13px/20px normal Helvetica, Arial, sans-serif;
18
        color: #4F5155;
19
    }
20
21
    a {
22
        color: #003399;
23
        background-color: transparent;
24
        font-weight: normal;
25
    }
26
27
    h1 {
28
        color: #444;
29
        background-color: transparent;
30
        border-bottom: 1px solid #D0D0D0;
31
        font-size: 19px;
32
        font-weight: normal;
33
        margin: 0 0 14px 0;
34
        padding: 14px 15px 10px 15px;
35
    }
36
37
    code {
38
        font-family: Consolas, Monaco, Courier New, Courier, monospace;
39
        font-size: 12px;
40
        background-color: #f9f9f9;
41
        border: 1px solid #D0D0D0;
42
        color: #002166;
43
        display: block;
44
        margin: 14px 0 14px 0;
45
        padding: 12px 10px 12px 10px;
46
    }
47
48
    #body {
49
        margin: 0 15px 0 15px;
50
    }
51
52
    p.footer {
53
        text-align: right;
54
        font-size: 11px;
55
        border-top: 1px solid #D0D0D0;
56
        line-height: 32px;
57
        padding: 0 10px 0 10px;
58
        margin: 20px 0 0 0;
59
    }
60
61
    #container {
62
        margin: 10px;
63
        border: 1px solid #D0D0D0;
64
        box-shadow: 0 0 8px #D0D0D0;
65
    }
66
    </style>
67
</head>
68
<body>
69
70
<div id="container">
71
    <h1>Welcome to CodeIgniter! You're browsing Application One!</h1>
72
73
    <div id="body">
74
        <p>The page you are looking at is being generated dynamically by CodeIgniter.</p>
75
76
        <p>If you would like to edit this page you'll find it located at:</p>
77
        <code>application/views/welcome_message.php</code>
78
79
        <p>The corresponding controller for this page is found at:</p>
80
        <code>application/controllers/Welcome.php</code>
81
82
        <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>
83
    </div>
84
85
    <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo  (ENVIRONMENT === 'development') ?  'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>
86
</div>
87
88
</body>
89
</html>

Конечно, вы должны изменить следующее сообщение в файле отображения, чтобы мы могли отличать приложение во время тестирования.

Для applications/app_one/views/welcome_message.php это должно выглядеть так:

1
<h1>Welcome to CodeIgniter! You're browsing Application One!</h1>

А для applications/app_two/views/welcome_message.php это должно выглядеть так:

1
<h1>Welcome to CodeIgniter! You're browsing Application Two!</h1>

Теперь мы сделали все, что касается нашей многоуровневой установки. Однако она не будет работать из коробки, но нам все равно нужно сообщить CodeIgniter о нашей настройке, так как она всегда загружает приложение по умолчанию, находящееся в каталоге application.

Последние штрихи

Давайте быстро рассмотрим настройку, которая настраивает каталог приложений по умолчанию. Откройте файл index.php в корневой папке приложения и найдите следующий фрагмент кода.

1
/*

2
 *---------------------------------------------------------------

3
 * APPLICATION DIRECTORY NAME

4
 *---------------------------------------------------------------

5
 *

6
 * If you want this front controller to use a different "application"

7
 * directory than the default one you can set its name here. The directory

8
 * can also be renamed or relocated anywhere on your server. If you do,

9
 * use an absolute (full) server path.

10
 * For more info please see the user guide:

11
 *

12
 * https://codeigniter.com/user_guide/general/managing_apps.html

13
 *

14
 * NO TRAILING SLASH!

15
 */
16
$application_folder = 'application';

Из приведенного выше фрагмента ясно, что он позволяет вам установить путь к вашему приложению по умолчанию. Таким образом, это место, где мы можем вносить изменения, чтобы он выбирал приложение по умолчанию из другого каталога, отличного от стандартного.

Конечно, вы могли бы пойти вперед и сразу сделать что-то подобное, и это должно запустить приложение app_one.

1
$application_folder = 'applications/app_one';

С другой стороны, что бы вы сделали, если хотите запустить app_two? Как быстро, вы можете скопировать файл index.php в index_app_one.php и index_app_two.php для каждого приложения. В своем виртуальном хосте убедитесь, что вы внесете соответствующие изменения.

С другой стороны, я предпочитаю несколько иной подход, и я хотел бы полагаться на переменную ENV, чтобы выбирать между различными приложениями во время выполнения.

Например, вы можете настроить пользовательскую переменную ENV в NGINX, как показано в следующем фрагменте.

1
// set the env variable CI_DEFAULT_APP in the "location" directive of vhost
2
fastcgi_param  CI_DEFAULT_APP  applications/app_one;

Если вы используете веб-сервер Apache, то это может быть достигнуто с помощью:

1
SetEnv CI_DEFAULT_APP applications/app_one

Затем переведем код в файл index.php, который использует переменную ENV, чтобы принять решение о запуске приложения по умолчанию.

1
...
2
...
3
$application_folder = (isset($_SERVER['CI_DEFAULT_APP']) ? $_SERVER['CI_DEFAULT_APP'] : 'application');
4
...
5
...

Итак, как вы можете видеть, мы сначала проверяем наличие переменной CI_DEFAULT_APP ENV, и если она недоступна, мы вернемся к приложению по умолчанию.

Чаще всего вы хотите запускать различные приложения в разных доменах. В идеале я хотел бы использовать два разных виртуальных хоста для каждого приложения. Быстрый пример каждого виртуального хоста должен выглядеть примерно так в контексте NGINX.

Домен www.ci-app-one.com указывает на app_one:

1
server {
2
  listen {YOUR_IP}:80;
3
  server_name  www.ci-app-one.com;
4
  root   /var/www/html;
5
  index index.html index.php;
6
7
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
8
    access_log off;
9
    expires max;
10
  }
11
12
  location / {
13
     # Check if a file or directory index file exists, else route it to index.php.
14
     try_files $uri $uri/ /index.php;
15
  }
16
17
  location ~ \.php$ {
18
    root   /var/www/html;
19
    fastcgi_split_path_info ^(.+\.php)(.*)$;
20
    fastcgi_pass 127.0.0.1:9000;
21
    fastcgi_index  index.php;
22
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
23
    fastcgi_param  CI_DEFAULT_APP  applications/app_one;
24
    include fastcgi_params;
25
  }
26
}

Аналогично, домен www.ci-app-two.com указывает на app_two:

1
server {
2
  listen {YOUR_IP}:80;
3
  server_name  www.ci-app-two.com;
4
  root   /var/www/html;
5
  index index.html index.php;
6
7
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
8
    access_log off;
9
    expires max;
10
  }
11
12
  location / {
13
     # Check if a file or directory index file exists, else route it to index.php.
14
     try_files $uri $uri/ /index.php;
15
  }
16
17
  location ~ \.php$ {
18
    root   /var/www/html;
19
    fastcgi_split_path_info ^(.+\.php)(.*)$;
20
    fastcgi_pass 127.0.0.1:9000;
21
    fastcgi_index  index.php;
22
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
23
    fastcgi_param  CI_DEFAULT_APP  applications/app_two;
24
    include fastcgi_params;
25
  }
26
}

Конечно, вы можете пойти еще дальше и проверить свои изменения, чтобы увидеть, действительно ли это работает или нет! Не стесняйтесь присылать мне любые вопросы, если у вас возникнут какие-либо проблемы.

И это был довольно простой способ, с помощью которого можно создать несколько приложений в рамках CodeIgniter с использованием единой кодовой базы.

Заключение

Сегодня мы рассмотрели интересный аспект фреймворка CodeIgniter, который позволяет управлять несколькими приложениями с использованием одной кодовой базы. Очевидными преимуществами этого являются простое обновление и обслуживание существующей кодовой базы.

CodeIgniter - мощный фреймворк PHP. Не забудьте также проверить, что у нас есть для вас.

Поделитесь своими мыслями, если вы уже внедрили нечто подобное, или вы бы приблизились к этому несколько иначе. В любом случае, я хотел бы услышать ваши мысли!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.