Функции Язык программирования PHP

session_set_save_handler

(PHP 4)

session_set_save_handler - устанавливает пользовательские функции хранения сессии.

Описание

bool session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)

session_set_save_handler() устанавливает пользовательские функции хранения сессии, которые используются для хранения и запрашивания данных, ассоциированных с сессией. Это чаще всего используется, когда метод хранения отличается от методов PHP-сессий. Например, при хранении данных сессии в локальной БД. Возвращает TRUE при успехе, FALSE при неудаче.

Примечание: вы обязаны установить в опции конфигурации session.save_handler значение user в вашем файле php.ini, для того чтобы session_set_save_handler() работала.

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

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

Функция read должна всегда возвращать значение, чтобы обработчик сохранения всегда работал, как ожидается. Возвращает пустую строку, если нет данных для чтения. Return-значения из других обработчиков конвертируются в булево выражение. TRUE при успехе, FALSE при неудаче.

Пример 1. session_set_save_handler()
<?php function open ($save_path, $session_name) { global $sess_save_path, 
$sess_session_name; $sess_save_path = $save_path; $sess_session_name = $session_name; 
return(true); } function close() { return(true); } function read ($id) { global 
$sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; 
if ($fp = @fopen($sess_file, "r")) { $sess_data = fread($fp, filesize($sess_file)); 
return($sess_data); } else { return(""); // Здесь обязана возвращать "". } } function 
write ($id, $sess_data) { global $sess_save_path, $sess_session_name; $sess_file 
= "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "w")) { return(fwrite($fp, 
$sess_data)); } else { return(false); } } function destroy ($id) { global $sess_save_path, 
$sess_session_name; $sess_file = "$sess_save_path/sess_$id"; return(@unlink($sess_file)); 
} /******************************************************************* * ПРЕДУПРЕЖДЕНИЕ 
- Вам понадобится реализовать здесь какой-нибудь * * вариант утилиты уборки мусора. 
* *******************************************************************/ function 
gc ($maxlifetime) { return true; } session_set_save_handler ("open", "close", 
"read", "write", "destroy", "gc"); session_start(); // продолжить нормальное использование 
сессий ?>

Назад Оглавление Вперёд
session_set_cookie_params Вверх session_start

Повторение

По умолчанию квантификаторы являются "жадными", то есть они совпадают максимально возможное количество раз (до максимально допустимого количества раз), не вызывая неудачи выполнения остальной части патэрна. Классический пример, когда это создаёт проблемы - попытка найти совпадения в комментарии C-программ. Комментарии появляются между символами /* и */, а внутри могут появляться отдельные символы * и /. Попытка найти совпадение с C-комментариями, применив патэрн

/\*.*\*/

к строке

/* первый комментарий */ не комментарий /* второй комментарий */

терпит неудачу, поскольку происходит совпадение с целой строкой из-за жадности элемента .*.

Однако, если после квантификатора идёт знак вопроса, он перестает быть жадным и совпадает минимально возможное количество раз, поэтому патэрн

/\*.*?\*/

верно выполняется с C-комментариями. Значение различных других квантификаторов не изменится, только предпочтительное количество совпадений. Не путайте это использование знака вопроса с его использованием в качестве собственно квантификатора. Поскольку он может использоваться двояко, они иногда может появляться удвоенным:

\d??\d

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

Если установлена опция PCRE_UNGREEDY (отсутствующая в Perl), то квантификаторы не жадничают по умолчанию, но отдельные могут быть жадными, если после них стоит знак вопроса. Другими словами, знак вопроса инвертирует поведение по умолчанию.