У меня есть страница, на которой я заставляю пользователя загружать данные, которые сервер сразу же архивирует для них. Вот как это выглядит:
createFilesList(); // <---- creates a text list of files do be zipped
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="'.$downloadFilename.'');
$fp = popen('cat '.$fullListOfFiles.' | sudo -u myuser zip -@ -9 - ', 'r');
$bufsize = 8192;
$buff = '';
while( !feof($fp) )
{
$buff = fread($fp, $bufsize);
echo $buff;
}
pclose($fp);
doClean(); // <----- deletes the list of files
Эта проблема: Если пользователь загружает файл, очистка работает нормально. Однако, если пользователь отменяет загрузку, список остается там неочищенным!
Неудачное решение из других постовДругие посты предложили это решение:
ignore_user_abort(true);
Несмотря на то, что это нормально работает для очистки, это создает новую проблему: если пользователь отменяет, процесс архивирования продолжается. Это тратит впустую ресурсы на компьютере без уважительной причины.
Как я могу гарантировать, что очистка выполняется?
Это должно выполняться каждый раз, даже после отмены пользователем -> register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
// register a shutdown cleanup
register_shutdown_function('doClean');
createFilesList(); // <---- creates a text list of files do be zipped
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="'.$downloadFilename.'');
$fp = popen('cat '.$fullListOfFiles.' | sudo -u myuser zip -@ -9 - ', 'r');
$bufsize = 8192;
$buff = '';
while( !feof($fp) )
{
$buff = fread($fp, $bufsize);
echo $buff;
}
pclose($fp);
Никогда не пробовал, но, возможно, это может сработать: просто используйте connection_aborted()
проверить перед архивированием.
createFilesList(); // <---- creates a text list of files do be zipped
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="'.$downloadFilename.'');
if(0 ==connection_aborted())
{
$fp = popen('cat '.$fullListOfFiles.' | sudo -u myuser zip -@ -9 - ', 'r');
$bufsize = 8192;
$buff = '';
while( !feof($fp) )
{
$buff = fread($fp, $bufsize);
echo $buff;
}
pclose($fp);
}
doClean(); // <----- deletes the list of files