Jump to content
  • 0

PHP кэш в файле, синхронизация обновления


rgl
 Share

Question

Есть некий php-скрипт, который делает довольно ресурсозатратную работу (рисует картинку - график по данным). Чтобы это дело оптимизировать, хочется результат работы закэшировать, т.е. просто записать в файл чтобы при последующих запросах отдавать готовый результат. Но данные через некоторое время устаревают, т.е. кэш нужно обновлять. Вопрос - как это сделать безопасно?

Т.е. вот вызвали скрипт, он понял что пора бы кэш обновить, сделал что надо, и вернул пользователю результат, но что если параллельно с ним кто-то еще вызовет тот же скрипт, и как ему понять, что кэш уже обновляют, все, что надо, это подождать секунду?

Удивительно, но все попытки найти ответ в гугле ничего не дали.

Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

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

Link to comment
Share on other sites

  • 0

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

 

только крон настройте чтобы чистил папку

Link to comment
Share on other sites

  • 0

Если кешироваться должен один набор данных, то проще некуда

<?php

$path = '/mydir/cache/';//директория с кешем

$date = date("Y.m.d");//текущая дата
$file = $path.$date.'.cache';//файл с кешем на текущую дату

if(file_exists($file)){//если файл с кешем на текущую дату найден
    $data = file_get_contents($file);//читаем данные из файла
}else{//если файл не найден
    $rdate = date("Y.m.d", strtotime('-1 days'));
    $rfile = $path.$rdate.'.cache';
    if(file_exists($rfile)){//если есть файл вчерашнего кеша
        unlink($rfile);//удаляем его
    }
    $data = "данные";//данные для кеширования 
    file_put_contents($file, $data);// записываем в файл текущие данные
}

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

Link to comment
Share on other sites

  • 0
8 hours ago, Switch74 said:

кто первый запустился, создает файл cash например, кто второй - видя этот файл не парит себе мозг его созданием,

Первый запустился, файла не нашел, создает, но ДО ТОГО как он это успел, запустился второй, и тоже файла не нашел, конфликт получается. Как бы второму узнать, что первый уже задачей озаботился, и надо лишь чуток подождать?

57 minutes ago, wwt said:

Если кешироваться должен один набор данных, то проще некуда

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

Есть такие страшные слова "race condition" и это то, от чего я хочу надежно, 100%-но предохраниться...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By kattiperk
      Здравствуйте. Кто что подскажет по gzip и кешированию? Пишу в .htaccess, мол, сожми текст и закешируй всё что можно. Оно всё работает, особенно gzip на 80% ужимает. Но Google Speed Test пишет, что никакого gzip и кеширования нет. У хостинга gzip автоматом не включен, то есть дублирования нет. Может, я где-то не права?
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy