Как обращаться с брошенным файлом PID, когда пользователь отменяет скрипт? - PullRequest
1 голос
/ 13 декабря 2011

Это больше вопрос о лучших практиках.Мой сервер позволяет пользователям конвертировать шрифты из одного формата в другой, используя FontForge.Во избежание коллизий в каждом конкретном случае допускается только одно преобразование шрифта.

Когда один пользователь инициирует преобразование, создается файл PID, который действует как блокировка.Если другой пользователь попытается инициировать преобразование, пока выполняется первое преобразование, сценарий на мгновение приостановится и снова проверит файл PID.

Это повторяется до тех пор, пока первый процесс не удалит файл PID, тем самым разблокируя доступ к FontForge.Однако, если первый пользователь отменяет сценарий до его завершения (нажав кнопку «Стоп» в браузере), сценарий завершает работу до удаления файла PID.Второй пользователь никогда не сможет продолжить.

Как лучше всего справиться с этим?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Хватит смотреть, как исчезает файл PID. Начните использовать flock, чтобы операционная система очистила блокировку, если вы выйдете преждевременно.

Пример кода от http://tuxradar.com/practicalphp/8/11/undefined:

<?php
    $fp = fopen("foo.txt", "w");
    if (flock($fp, LOCK_EX)) {
        print "Got lock!\n";
        sleep(10);
        flock($fp, LOCK_UN);
    }
?>

Также http://php.net/manual/en/function.flock.php.

0 голосов
/ 13 декабря 2011

Просмотр этой справочной страницы PHP:

http://php.net/manual/en/features.connection-handling.php

Цитирую:

Вы можете решить, хотите ли вы, чтобы отключение клиента вызывало ваш скрипт будет прерван. Иногда удобно всегда иметь свой сценарии выполняются до конца, даже если удаленный браузер не получает выход. Поведение по умолчанию, однако, для вашего сценария прервано, когда удаленный клиент отключается. Это поведение может быть установлено через директиву ignore_user_abort php.ini, а также через соответствующая директива php_value ignore_user _abort Apache httpd.conf или с функцией ignore_user_abort(). Если вы не говорите PHP игнорируйте прерывание пользователя и прерывание, ваш сценарий будет прерван.

Единственное исключение - если вы зарегистрировали функцию отключения, используя register_shutdown_function(). С функцией отключения, когда удаленный пользователь нажимает кнопку STOP, когда в следующий раз ваш скрипт попытается вывести что-то, что PHP обнаружит, что соединение было прервано и функция отключения вызывается. Эта функция отключения также будет вызываться в конце вашего скрипта нормально завершается, так что делать что-то другое в случае отключения клиента, вы можете использовать connection_aborted() функция. Эта функция вернет TRUE, если соединение было прервано.

...