2010-12-29 5 views
2

Я создал небольшой класс для создания миниатюр с внешней программой (gm из ImageMagick, если вам интересно). Класс вызывает вызов exec() для запуска gm.exe, но я ударил PHP bug, что заставляет замораживать 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 откроет его снова!

ответ

1

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

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

+0

Несколько раз «невозможно сделать» - это единственный достойный ответ. Спасибо всем. –

1

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

1

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

Смежные вопросы