Хранение сессий в БД - можно ли настроить в php.ini?

test3

Guest
Хранение сессий в БД - можно ли настроить в php.ini?

Начал работу с сессиями в Apache+PHP+MySQL, надо хранить их в БД. Нашел пример, работает, но приходится в каждый скрипт включать установку соединения с базой, описания функций хендлеров сессии open(), close(), read(), write(), destroy(), gc() и session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");
Понятно, что включение просто через include_once, но нельзя ли вообще этого избежать? (использование сессий из PEAR или ADODB просто скрывает проблему).

В PHP.INI есть параметр session.save_handler = files, который вроде можно установить в session.save_handler = user. Но описание есть только для files ! В одном тексте было сказано, что user необходимо установить, чтобы session_set_save_handler вообще работала; но у меня (Php5, Apache1.3) мои сессии работают и без этого. Только вот в каждом скрипте их надо включать, в то время как стандартное хранение в files превосходно работает без моего участия.

Собственно вопрос: можно ли однократно указать PHP для всех сессий использовать одно соединение с БД и один набор функций? Чтобы не открывать каждый раз в своем скрипте соединение и не регистрировать те же функции заново?

По идее, это как-то можно сделать; но как?
Просьба не посылать меня в поиск! Я там был и ничего не нашел - только те же вопросы и сообщения о безуспешных экспериментах! Если кто найдет сообщение об успешном использовании (указать соединение и функции один раз, а в скриптах просто вызывать session_start() без предшествующего include 'mysess.inc' или include 'PEAR/HTTP/Session') - напишите сюда прямую ссылку!
 

Фанат

oncle terrible
Команда форума
Собственно вопрос: можно ли однократно указать PHP для всех сессий использовать одно соединение с БД и один набор функций? Чтобы не открывать в своем скрипте соединение и не регистрировать те же функции заново?
По идее, это как-то можно сделать
поделись с нами этой идеей, пожалуйста.
а потом мы продолжим.
 

Фанат

oncle terrible
Команда форума
alexhemp, ЧИТАЙ ВОПРОС ВНИМАТЕЛЬНЕЕ.
специально для тех, кто ниасалил целиком, я процитировал ключевой момент.
 

Profic

just Profic (PHP5 BetaTeam)
Чесслово странное желание. Чем не устраивает include 'mysess.inc';? Так сложно написать одну строчку?

А вообще:
Ответ номер раз - нет нельзя.
Ответ номер два - да можно, исходники php в руки и вперед с песней. Писать свой session-handler на C.
 

Фанат

oncle terrible
Команда форума
если кто до сих пор не понял
к сессиям его вопрос не имеет отношения
 

test3

Guest
Автор оригинала: Фанат
поделись с нами этой идеей, пожалуйста.
а потом мы продолжим.
Идея проста. Пишем в php.ini что-то вроде
session.save_handler = DB
session.DBparams = 'mysql://user:password@host:port/basename:tablename'
где определяется соединение с БД и таблица для хранения сессий.
Функции обработки применяются те же внутренние, как и для хранения файлов, просто вместо имени файла, времени модификации и текста файла используются 3 поля указанной таблицы. Если ее нет, она создается. Но я этого факта в моих скриптах не вижу и не должен видеть - я просто ставлю в скриптах session_start(), как обычно, и скриптам должно быть без разницы, что хранение сессий идет не в файлах, а в базе!

Если такой подход слишком неудобен для разработчиков PHP, то можно скажем написать
session.save_handler = '/abspath/my_sess.php'
с тем чтобы PHP однократно и для всех скриптов с сессиями использовал указанный скрипт для открытия связи с БД и регистрации обработчиков через session_set_save_handler (), а скрипты опять-таки ничего об этом не знали и работали бы так же, как и при хранении сессий в файлах.
 

alexhemp

Новичок
Фанат

Конечно, его вопрос про настройку php.ini

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

Фанат

oncle terrible
Команда форума
чювак.
ты в скрипты свои больше ничего не инклюдишь?
только обработчик сессий?
больше ничего?
ни настроек, ни классов, ни библиотек?
и БД у тебя использвется исключительно только для работы с сессиями?

тебя так напрягает написать в скриптах один инклюд?
а session_start() писать тебя не напрягает?

чтобы PHP однократно и для всех скриптов с сессиями использовал указанный скрипт
поясни мне - откуда ты взял идею про однократный скрипт.
ты вообще - в курсе того, как пхп работает?

-~{}~ 09.09.05 18:57:

alexhemp
к настройкам php.ini его вопрос тоже не имеет отношения.
его вопрос имееот отношение к факу на танке.

остальные же ответы не имеют смысла.
они бессмысленные. как и вопрос.
и я сильно удивлёт тем, что до сих пор этого не понял
расскажи мне, как ему поможет препенд ОДНОКРАТНО пропарсить скрипт с его кустарными сессиями и как поможет в поддержании соединения с базой.
 

test3

Guest
Автор оригинала: alexhemp Я разве ему не подсказал, где рыть?
Нет, не подсказал. Я там рыть не хочу!
Насколько я понимаю, auto_prepend позволяет автомодифицировать скрипты при выполнении, добавляя скажем вызов моего my_sess.inc. Но, опять-таки, при выполнениии каждого скрипта PHP будет регистрировать мои функции хендлера - в общем случае даже разные для разных скриптов!
А я хочу, чтобы он использовал свои стандартные хендлеры, просто хранил бы их не в файловой системе, а в SQL базе!
Для этого я должен бы просто сказать в php.ini - "используй вместо файловой системы указанную таблицу SQL-базы", структура которой естественно предопределена.
 

Фанат

oncle terrible
Команда форума
test3
короче.
ты не понимаешь, как работает пхп.
Вот тебе ссылка: PHP FAQ: Самые основы. Как работает PHP.
почитай.
после этого ты поймёшь, что требовать постоянного соединения к бд и однократного парсинга функций во-первых, невозможно, а во-вторых - не нужно.

а без этих требований задача сводится к стандартной - как подключить некий код ко всем скриптам.

-~{}~ 09.09.05 19:11:

А я хочу, чтобы он использовал свои стандартные хендлеры, просто хранил бы их не в файловой системе, а в SQL базе!
ты сказку о рыбаке и рыбке читал?
 

DiTHER

bang bang
А я хочу, чтобы он использовал свои стандартные хендлеры, просто хранил бы их не в файловой системе, а в SQL базе!
Для этого я должен бы просто сказать в php.ini - "используй вместо файловой системы указанную таблицу SQL-базы", структура которой естественно предопределена.
хы.. сравниваешь пхп, скажем с exim'ом? :))
 

test3

Guest
Автор оригинала: Фанат требовать постоянного соединения к бд и однократного парсинга функций во-первых, невозможно, а во-вторых - не нужно.
Если я напишу у себя mysql_pconnect() - это будет постоянное соединение для данного экземпляра PHP. Это вполне меня устроит, я использую php5apache.dll
А вот если я просто пишу session_start() в режиме files - PHP просто выполнит свои стандартные обработчики, работающие с файлами. Неужели он неявно будет вызывать session_set_save_handler ("standart_file_open", "standart_file_close", "standart_file_read", "standart_file_write", "standart_file_destroy", "standart_file_gc") ?!

В стандартном режиме files функция session_set_save_handler () вызывается однократно в момент инициализации PHP!!! Или даже вообще не вызывается...
Разве не так?

Так неужели нельзя так же однократно проинициализировать другим обработчиком?!

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

Фанат

oncle terrible
Команда форума
Если я напишу у себя mysql_pconnect() - это будет постоянное соединение для данного экземпляра PHP.
попрдробнее про экземпляры, пожалуйста

-~{}~ 09.09.05 19:34:

Если я напишу у себя mysql_pconnect() - это будет постоянное соединение
это не избавит тебя от необходимости писать mysql_pconnect() в каждом скрипте. то есть, ценности пконнект для тебя не представляет никакой

-~{}~ 09.09.05 19:36:

В стандартном режиме files функция session_set_save_handler () вызывается однократно в момент инициализации PHP!!!
поподробнее про момент инициализации.
Так неужели нельзя так же однократно проинициализировать другим обработчиком?!
можно. тебе сказали, как - напиши свой модуль под пхп.

-~{}~ 09.09.05 19:40:

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

test3

Guest
В связке с Апачем ПХП может работать аналогично mod_perl - то есть не создавать новый процесс при каждом запросе, а передавать запрос на выполнение того или иного скрипта уже запущенному процессу.
Можно, конечно, настроить Апач чтобы он вызывал ПХП как CGI-программу - на каждый запрос заново. Вот в комплексе Денвер так совмещены PHP4 и PHP5 - один работает как часть Апача, другой как внешняя программа, кому какой запрос отдавать решает Апач по расширению файла.

Так вот в режиме внешней программы PHP закрывает соединения и завершается; а вот как часть Апача он ждет следующего запроса на выполнение других скриптов (не разрывая общего с Апачем соединения с БД). Именно этот режим я и имел в виду.
 

Фанат

oncle terrible
Команда форума
В связке с Апачем ПХП может работать аналогично mod_perl
это заблуждение.
как часть Апача он ждет следующего запроса на выполнение других скриптов (не разрывая общего с Апачем соединения с БД). Именно этот режим я и имел в виду.
Именно этот режим тебе нужен, как рыбке зонтик.
 

alexhemp

Новичок
test3

Затраты на коннект к msyql - ничтожны.

В общем у тебя 2 пути.

1. Написать на php свой session_save_handler и вместо include/require сделать auto_prepend - тогда все сессии могут обрабатываьтся твоим хендлером.

2. Написать на C расширение для хранения сессий в базе. От постоянного коннекта это тебя тоже не спасет.
Ничего плохого в этом нет - файлы тоже каждый раз открываются - но никто же не стремиться держать файл постоянно открытым.

И как сказад Фанат - ты просто не понимашь, как взаимодействует PHP с Apache.
 
Сверху