Я создал небольшой класс для создания миниатюр с помощью внешней программы (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 снова откроет его!