#php #mysql #session #new-operator
#php #mysql #сеанс #new-operator
Вопрос:
Просто хочу заранее извиниться за то, что написал так много текста. Вот в чем проблема: я использую постоянное соединение для подключения к базе данных с wait_timeout 60 секунд, и я сохраняю данные сеанса в таблице MySQL. Проблема, с которой я сталкиваюсь, заключается в том, что сеансы, похоже, просто не используют свои собственные строки; каждое обновление страницы продолжает запускать новый сеанс вместо использования старого. Более того, постоянные соединения, упомянутые ранее, продолжают запускать новые процессы вместо того, чтобы использовать свои собственные, как они должны. Поскольку эти две проблемы, похоже, имеют одинаковое происхождение, я решил объединить их здесь. Мой PHP-код выглядит следующим образом:
mysql_connect(‘localhost’, ‘root’) или die(‘Не удалось подключиться: ‘ . mysql_error()); mysql_set_charset(‘utf8’);
mysql_select_db(‘azgoth’) или die(‘Не удалось выбрать DB: ‘ . mysql_error());
session_set_cookie_params(3600,'/','www.azgoth',FALSE,TRUE);
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
function _open(){
return true;}
function _close(){
return true;}
function _read($id){
$id = mysql_real_escape_string($id);
if ($result = mysql_query("SELECT data FROM sess_en WHERE id='$id'")) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];}}
return '';}
function _write($id, $data){
$access = $_SERVER['REQUEST_TIME'];
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
return mysql_query("REPLACE INTO sess_en VALUES('$id', '$access', '$data')");}
function _destroy($id){
$id = mysql_real_escape_string($id);
return mysql_query("DELETE FROM sess_en WHERE id='$id'");}
function _clean($max){
$old = $_SERVER['REQUEST_TIME'] - $max;
$old = mysql_real_escape_string($old);
return mysql_query("DELETE FROM sess_en WHERE access<'$old'");}
session_start();
Есть идеи о том, что может быть причиной этой проблемы?
РЕДАКТИРОВАТЬ: сначала я подумал, что это только в моей голове, но теперь я могу подтвердить это: эта странная вещь продолжает появляться случайным образом: обычно это происходит, но не иногда (на самом деле, редко). нет..
Комментарии:
1. К вашему сведению, чтобы поместить данные в блок кода на SO, просто префикс каждой строки кода с четырьмя пробелами или оберните его в a
<pre>
. Или выделите код и нажмите кнопку code{}
.
Ответ №1:
Проблема с запуском нового сеанса каждый раз, вероятно, связана с переданным вами параметром домена session_set_cookie_params()
. Вы прошли www.azgoth
, предположительно, потому, что у вас более одного домена верхнего уровня (TLD), и вы хотите, чтобы файлы cookie были общими для всех из них. Это не разрешено. С тем, что вы установили, TLD является azgoth
, что (в настоящее время) невозможно, поэтому файл cookie будет недействительным и никогда не будет отправлен обратно на сервер, следовательно, каждый раз будет запускаться новый сеанс.
Постоянная проблема с БД, вероятно, связана с конфигурацией сервера. В руководстве по PHP указано, что на странице для mysql_pconnect()
:
Обратите внимание, что ссылки такого рода работают только в том случае, если вы используете модульную версию PHP. Для получения дополнительной информации см. Раздел «Постоянные подключения к базе данных».
…и…
Использование постоянных подключений может потребовать небольшой настройки ваших конфигураций Apache и MySQL, чтобы гарантировать, что вы не превышаете количество подключений, разрешенных MySQL.
Комментарии:
1. В настоящее время у меня есть три языковые версии сайта: lt.azgoth (литовский), ru.Azgoth (русский) и www.azgoth (Английский). В приведенном выше примере я просто хотел, чтобы файл cookie сеанса был доступен только на английском сайте, однако, с моими ограниченными знаниями в php на основе сеанса, я, должно быть, облажался. Итак, что вы говорите, невозможно создать отдельные сеансовые файлы cookie для каждой версии сайта, и мне пришлось бы полагаться только на имена таблиц базы данных, верно?
2. Нет ничего невозможного в том, чтобы делать то, что вы хотите — вам просто нужно включить домен верхнего уровня (.com, .net, .org и т. Д.) В ваш домен cookie. Таким образом, вы можете установить для английских
www.azgoth.com
, а для русскогоru.azgoth.com
— но вы должны включить.com
. Вы можете установить файлы cookie, которые являются глобальными для всех «языков» (т.Е. поддоменов), установив для домена значение.azgoth.com
— т.е. опустить поддомен, но включить ведущий.
.3. Я полагаю, что теперь я вижу проблему. Поскольку я сохраняю скрипты на локальном хосте, теперь у меня есть только адреса без .com (например, я получаю доступ к своему сайту через
http://azgoth
). Должно быть, это то, что мешает стандартным требованиям PHP к структуре. Спасибо за ваши ответы, Дэйв, вы очень помогли!4. Если ваш пользователь уже находится в той части сайта, для которой должен быть установлен файл cookie, возможно, было бы проще просто игнорировать параметр домена в любом случае — это, безусловно, повысит переносимость. Вы можете пропустить этот параметр с пустой строкой
''
, и он должен работать так, как вы хотите (я думаю — если я понимаю, что вы делаете правильно …)