php: остатки процесса очистки после отмены пользователем

У меня есть страница, на которой я заставляю пользователя загружать данные, которые сервер сразу же архивирует для них. Вот как это выглядит:

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);

Несмотря на то, что это нормально работает для очистки, это создает новую проблему: если пользователь отменяет, процесс архивирования продолжается. Это тратит впустую ресурсы на компьютере без уважительной причины.

Как я могу гарантировать, что очистка выполняется?

0

Решение

Это должно выполняться каждый раз, даже после отмены пользователем -> 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);
0

Другие решения

Никогда не пробовал, но, возможно, это может сработать: просто используйте 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
0

По вопросам рекламы [email protected]