Запись файла изображения: безопасный способ заблокировать файл

У меня есть веб-сайт, на котором люди отправляют контент, который затем вставляется в коллективное изображение. Мой код работает, но я пока нашел одну проблему:

Если 2 человека пытаются писать одновременно (скажем, оба отправляют одновременно), это приводит к тому, что выходной файл становится 0 КБ, другими словами, это просто пустой файл.

Я пишу, используя выходной буфер, GD2 и file_put_contents, например:

ob_start();
imagejpeg($map);
file_put_contents(MAP, ob_get_contents(), FILE_BINARY);
ob_end_clean();

Мне интересно, как лучше решить эту проблему?

Спасибо!


person fiiv    schedule 24.05.2011    source источник


Ответы (2)


Задокументированные механизмы блокировки в PHP, которые я пробовал некоторое время назад, похоже, не надежно предотвращали конфликты в моей системе. Даже для простого счетчика веб-сайтов я использовал пустой файл со значением счетчика в фактическом имени файла после некоторых других попыток, потому что переименование файла, по крайней мере, является атомарной операцией.

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

В качестве альтернативы вы можете рассмотреть возможность сохранения изображения в базе данных.

person Medo42    schedule 24.05.2011

person    schedule
comment
Я обдумал это. Но разве это не сделает файл недоступным для записи для одного из двух человек и не вернет уродливую ошибку о том, что файл недоступен для записи? - person fiiv; 25.05.2011
comment
Второй сценарий, пытающийся получить блокировку, должен ждать, пока блокировка не будет снята. - person rid; 25.05.2011
comment
@MT будет, но даже если их действия будут регулироваться каким-то умным мьютексом (у меня есть такой :)), второй пользователь переопределит все данные первого пользователя. - person OZ_; 25.05.2011