Я создал небольшой класс для создания миниатюр с внешней программой (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 откроет его снова!
Несколько раз «невозможно сделать» - это единственный достойный ответ. Спасибо всем. –