Разделяет ли codeigniter сеансы mysql между запросами http - PullRequest
1 голос
/ 23 ноября 2011

Есть ли способ, чтобы 2 разных http-запроса использовали одно и то же соединение / сеанс mysql при использовании класса базы данных codeigniter (например, $ this-> db)?Я слышал, что некоторые фреймворки делают это, однако, благополучие моего проекта зависит от надежды, что codeigniter этого не сделает.Потому что я создаю временные таблицы, и каждый запрос должен иметь отдельную временную таблицу, а не делиться ими.Кто-нибудь может уточнить?

edit

Я также использую блокировку таблицы.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

YES. Если ваша конфигурация фреймворка использует постоянное соединение, то все временные таблицы будут присутствовать от одного вызова к другому. Если вы не используете постоянное соединение, то в конце скрипта соединение с БД автоматически прервется, и ваш следующий скрипт запустится заново. Если вы полагаетесь на временные таблицы в своих вызовах, и они должны отличаться, будьте осторожны. За сайт MYSQL:

Таблица TEMPORARY видна только текущему соединению и автоматически удаляется при закрытии> соединения. Это означает, что два разных соединения могут использовать одну временную таблицу имя, не вступая в конфликт друг с другом или с существующей не ВРЕМЕННОЙ таблицей с тем же именем.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Вы упомянули фреймворки, так что вот пример для вас в CodeIgniter. Создать контроллер. Давайте назовем CTRL, а затем набор методов step1, step2, step3, step4. Тебе нужны только 1 и 2, но я немного переборщил:

function step1()
{
    $this->your_model->db->query("CREATE TEMPORARY TABLE test (col1 int null);");
    $this->your_model->db->query("INSERT INTO test values (1);");
}

function step2()
{
    $res = $this->your_model->db->query("SELECT * from test;");
    print_r($res->result_array());

}
function step3()
{
    $this->your_model->db->query("INSERT INTO test values (2);");
    $this->your_model->db->query("INSERT INTO test values (3);");

}
function step4()
{
    $res = $this->your_model->db->query("SELECT * from test;");
    print_r($res->result_array());

}

Если вы запустили вышеупомянутое с pconnect, установленным в TRUE, выполнив это по очереди:

http://yoursite/CTRL/step1
http://yoursite/CTRL/step2
http://yoursite/CTRL/step3
http://yoursite/CTRL/step4

Вы получите данные, вставленные и затем отображенные при одном вызове другому, что означает, что ваша таблица TEMP все еще там.

Теперь, измените 'pconnect' на FALSE, сбросьте ваш сервер и снова запустите выше, вы получите:

Table 'yourdb.test' doesn't exist

SELECT * from test;

Filename: C:\yourpath\system\database\DB_driver.php
0 голосов
/ 23 ноября 2011

HTTP - это протокол без сохранения состояния, и поэтому каждый PHP-скрипт выполняется и завершается по отдельным запросам, поэтому невозможно поддерживать постоянное соединение между запросами, если только он не обрабатывается внешним процессом. Даже если вы используете HTTP / 1.1 с поддержкой Keep-alive, даже если несколько запросов HTTP обрабатываются одним процессом / потоком Apache (например) и соединением - отдельные запросы по-прежнему представляют разные исполнения скрипта. Это не имеет ничего общего с CodeIgniter. Однако, если вы установили pconnect для подключения к базе данных, PHP будет пытаться повторно использовать это подключение к базе данных, когда это возможно. Это по-прежнему не означает, что это тот же сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...