Запись файла изображения: безопасный способ блокировки файла - PullRequest
0 голосов
/ 25 мая 2011

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

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

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

file_put_contents(MAP, ob_get_contents(), LOCK_EX)

1 голос
/ 25 мая 2011

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

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

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

...