Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Атомарная запись в файл + require (dimkalinux, оценка: 2)
Author Message
dimkalinux
Заглянувший



Joined: 11 Jul 2011
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Mon Jul 11, 2011 2:39 pm (написано за 4 минуты 30 секунд)
   Post subject: Атомарная запись в файл + require
Reply with quote

Добрый день.

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

Файл кеша не читается напрямую функциями fread или подобными — только require.
Поэтому не понятно как require работает с блокировками.

Текущий вариант
Code (any language): скопировать код в буфер обмена
function write_cache_file($file, $content)
{
        $tmp_file = tempnam(FORUM_CACHE_DIR, md5($file.time().uniqid()));
        if (!$tmp_file)
        {
                return false;
        }

        $fh = @/**/fopen($tmp_file, 'wb');
        if (!$fh)
        {
                // Unlink TMP
                if (file_exists($tmp_file))
                {
                        unlink($tmp_file);
                }
                return false;
        }

        // Write
        fwrite($fh, $content);
        fclose($fh);

        // Rename TMP to file
        if (!@/**/rename($tmp_file, $file))
        {
                // Unlink TMP
                if (file_exists($tmp_file))
                {
                        unlink($tmp_file);
                }
                return false;
        }

        return true;
}
Что лучше и правильней использовать - rename, если сбой то unlink и опять rename или же использовать LOCK_EX?
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Mon Jul 11, 2011 3:38 pm (спустя 59 минут; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

dimkalinux,
используйте блокировки.
Quote:
Поэтому не понятно как require работает с блокировками.
Боюсь ответ на этот вопрос дадут только исходники PHP или эксперимент. (-;
Но скорее всего работает аналогично функциям fread, и.т.п.
Back to top
View user's profile Send private message Send e-mail
dimkalinux
Заглянувший



Joined: 11 Jul 2011
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Mon Jul 11, 2011 3:40 pm (спустя 2 минуты; написано за 23 секунды)
   Post subject:
Reply with quote

Переписал с LOCK
Code (any language): скопировать код в буфер обмена
function write_cache_file($file, $content)
{
        // Open
        $handle = @fopen($file, 'r+b'); // @ - file may not exist
        if (!$handle)
        {
                $handle = fopen($file, 'wb');
                if (!$handle)
                {
                        return false;
                }
        }

        // Lock
        flock($handle, LOCK_EX);
        ftruncate($handle, 0);

        // Write
        if (fwrite($handle, $content) === false)
        {
                // Unlock and close
                flock($handle, LOCK_UN);
                fclose($handle);

                return false;
        }

        // Unlock and close
        flock($handle, LOCK_UN);
        fclose($handle);

        return true;
}
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Mon Jul 11, 2011 3:52 pm (спустя 11 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

Небольшая пробежка в гугле навела на следующую страницу https://bugs.php.net/bug.php?id=52287,
что поясняет тот факт, что поддержка блокировок в функциях семейства include всё-таки есть...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Tue Jul 12, 2011 10:01 am (спустя 18 часов 9 минут; написано за )
   Post subject:
Reply with quote

В винде, вроде как, блокировки являются не рекомендательными, а принудительными, и, видимо, корректной поддержки там все же нет. Ну и способов атомарно заменить файл под виндой тоже нет, увы.
Back to top
View user's profile Send private message Send e-mail
dimkalinux
Заглянувший



Joined: 11 Jul 2011
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Tue Jul 12, 2011 10:28 am (спустя 26 минут; написано за 33 секунды)
   Post subject:
Reply with quote

Спасибо за помощь.
Остановлюсь на варианте с блокировкой.
Back to top
View user's profile Send private message
Peter111
Заглянувший



Joined: 13 Jan 2014
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Mon Jan 13, 2014 10:43 am (спустя 2 года 6 месяцев 1 день 15 минут; написано за 13 секунд)
   Post subject:
Reply with quote

In Windows, kind of like, no locks are advisory and mandatory, and, apparently, proper support there still is not. Well ways atomically replace a file under Windows either, alas.
Back to top
View user's profile Send private message
xmakisx
Заглянувший



Joined: 21 Mar 2014
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 21, 2014 10:56 pm (спустя 2 месяца 8 дней 12 часов 12 минут; написано за 23 секунды)
   Post subject:
Reply with quote

Peter111 wrote:
In Windows, kind of like, no locks are advisory and mandatory, and, apparently, proper support there still is not. Well ways atomically replace a file under Windows either, alas.
по русски
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML