PHP: отвязка слишком эффективна

Я разрабатываю веб-страницу PHP, которая на лету создает файл .SVG из базы данных SQL, встраивает его в страницу и позволяет пользователю взаимодействовать с ним. Эти временные файлы имеют форму SVG[RandomNumber].svg, и функция отмены связи успешно удаляет файлы без сообщений об ошибках.

Вот проблема: я предположил, что если я вызову функцию unlink после того, как файл SVG загрузится для пользователя, веб-страница не пострадает, поскольку браузер пользователя кэшировал файл или что-то еще. Все отлично работает, когда в коде нет команды unlink; однако «отключение» в любом месте — даже в конце веб-страницы — не приводит к тому, что объект вообще отображается. В Firefox нет следов объекта, а в IE я получаю сообщение об ошибке «Веб-страница не найдена».

Итак, я удалил файл до того, как браузер его загрузил? Как лучше поступить в общей ситуации?

Спасибо.


person user2629001    schedule 29.07.2013    source источник
comment
Вы на самом деле отменяете связь после загрузки изображения или после загрузки страницы (содержащей изображение)? И то, и другое не может произойти одновременно... браузеру необходимо получить и проанализировать страницу, прежде чем он сможет даже узнать, нужно ли загружать изображение.   -  person cHao    schedule 29.07.2013
comment
Благодарю за разъяснение. Я немного новичок в разработке и не понял порядка загрузки различных сущностей. Я полагаю, что вызывал команду еще до того, как страница завершила загрузку. Есть ли лучшее место для вызова команд или другой последовательный способ автоматического удаления этих временных файлов?   -  person user2629001    schedule 29.07.2013
comment
Лично я мог бы подумать об обслуживании файла через PHP-скрипт, а не просто как ссылку на статический файл. Сценарий, конечно же, знал бы, что файл был загружен, и мог бы безопасно удалить его. Хотя в этот момент, в зависимости от характера изображения, может быть лучше оставить файл там на некоторое время.   -  person cHao    schedule 29.07.2013
comment
Было бы лучше отложить удаление временных файлов с помощью задания cron, которое удалит файлы старше своего периода.   -  person David Jashi    schedule 29.07.2013
comment
[Также размещено в ответе 1 ниже:] До этого я использовал echo для «распечатки» объекта faux-SVG прямо на веб-странице. Это дало функционирующую страницу, но создало ошибки проверки HTML, поэтому я подумал, что было бы лучше создать файл на лету, встроить его, а затем удалить. Тем не менее, если бы я мог эхо вывести объект без этих ошибок, я был бы очень счастлив.   -  person user2629001    schedule 29.07.2013
comment
Разве HTML 5 не позволяет вставлять SVG прямо на страницу? Кажется, я что-то припоминаю, что он распознает пространство имен SVG.   -  person cHao    schedule 29.07.2013
comment
Ага! На протяжении вечности у меня просто лежал XHTML 1.0 Transitional в верхней части моей веб-страницы. Я посмотрю, исправит ли это преобразование в HTML 5.   -  person user2629001    schedule 29.07.2013
comment
Ничего себе, это сделало вещи простыми. Вот и решение — полностью отказаться от создания автономного файла и просто свернуть его в HTML5! Спасибо. Это также дало толчок к тому, чтобы убедиться, что мой HTML находится в идеальной форме.   -  person user2629001    schedule 29.07.2013


Ответы (1)


Может быть полезно изменить рабочий процесс и не создавать временные файлы. Когда изображение используется только один раз или его генерация не имеет большого значения, вы можете попытаться сгенерировать его на лету следующим образом.

<?php
// We'll be outputting a SVG
header('Content-type: Content-Type: image/svg+xml');

// It will be called image.svg
header('Content-Disposition: attachment; filename="image.svg"');

// Don't cache
header("Cache-Control: no-cache, must-revalidate");
header("Expires: " . date("D, j M Y H:i:s")); 

// The PDF source is in original.pdf
generate_svg_from_db('image.svg');
?>
person tomas789    schedule 29.07.2013
comment
Я должен изучить этот подход. (Я никогда раньше не имел дело с командой header().) До этого я использовал echo для «распечатки» фальшивого SVG-объекта прямо на веб-странице. Это дало функционирующую страницу, но создало ошибки проверки HTML, поэтому я подумал, что было бы лучше создать файл на лету, встроить его, а затем удалить. Однако мне нравится идея альтернативного рабочего процесса. - person user2629001; 29.07.2013