Рекомендуемый способ обнаружения сессий - PullRequest
2 голосов
/ 29 декабря 2010

Я создал небольшой класс для создания миниатюр с помощью внешней программы (gm из ImageMagick, на случай, если вам интересно). Класс выдает exec() вызов для запуска gm.exe, но я столкнулся с ошибкой PHP , которая заставляет httpd.exe зависать при одновременном выполнении и открытии сеанса PHP. Существует обходной путь, который выглядит следующим образом:

session_write_close();
exec('gm convert -resize 100x100 source.jpg target.jpg');
session_start();

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

Как я могу правильно определить, существует ли активный сеанс? Или, другими словами, скрипт PHP, который вызывает мою функцию, вызвал вызов session_id() и не закрылся или уничтожил сеанс любым способом, поэтому операционная система, вероятно, держит открытый дескриптор, который блокирует файл сеанса, поэтому он не может быть доступен другим запущенным процессам, которые могут замерзнуть httpd.exe.

Я пробовал это:

if( session_id() ){
    session_write_close();
    exec('gm convert -resize 100x100 source.jpg target.jpg');
    session_start();
}

Но я заметил, что session_id() возвращает значение, если скрипт когда-либо использовал сессии, даже если они не активны на данный момент. Если сценарий закрыл сеанс с session_write_close() ... мой thumbnailer снова откроет его!

Ответы [ 3 ]

1 голос
/ 29 декабря 2010

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

1 голос
/ 29 декабря 2010

В PHP нет методов для этого. В итоге мне пришлось выполнить пару простых функций-оболочек, которые проверяют глобальную переменную (bleah), которую моя функция-оболочка запуска сеанса установила при первом запуске сеанса.

1 голос
/ 29 декабря 2010

Вы не можете на самом деле.Не похоже, что для этого есть какие-то функции.http://www.php.net/manual/en/book.session.php

Возможно, вы могли бы провести некоторый анализ файлов в каталоге, возвращаемых session_save_path ().Но у вас будут проблемы с надежной работой с различными платформами и нестандартными обработчиками сеансов.

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