Статьи

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • кэш
  • конфиг
  • бревна

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

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

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

  • Контроллеры / welcome.php
  • просмотров / ошибки
  • просмотров / welcome_message.php

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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 должен выглядеть следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?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;
    ::-moz-selection { background-color: #E13300;
 
    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!
 
    <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.
</div>
 
</body>
</html>

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

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

1
<h1>Welcome to CodeIgniter!

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

1
<h1>Welcome to CodeIgniter!

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
/*
 *—————————————————————
 * 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.
 * can also be renamed or relocated anywhere on your server.
 * 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 .

1
$application_folder = ‘applications/app_one’;

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

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

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

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

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

1
SetEnv CI_DEFAULT_APP applications/app_one

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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. Независимо от того, начинаете ли вы или начинаете со следующей версии, не забудьте также проверить, что у нас есть для вас.

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