2012-03-18 3 views
3

У меня есть плагин WordPress с резервным скриптом, который выполняется по расписанию. Уловка, если кто-то несколько раз ударяет страницу, он может выполнить сценарий резервного копирования несколько раз. Любые мысли о том, как предотвратить множественные казни?Как я могу предотвратить выполнение PHP несколько раз?

global $bwpsoptions; 

     if (get_transient('bit51_bwps_backup') === false) { 

      set_transient('bit51_bwps_backup', '1', 300); 

      if ($bwpsoptions['backup_enabled'] == 1) { 

       $nextbackup = $bwpsoptions['backup_next']; //get next schedule 
       $lastbackup = $bwpsoptions['backup_last']; //get last backup 

       switch ($bwpsoptions['backup_interval']) { //schedule backup at appropriate time 
        case '0': 
         $next = 60 * 60 * $bwpsoptions['backup_time']; 
         break; 
        case '1': 
         $next = 60 * 60 * 24 * $bwpsoptions['backup_time']; 
         break; 
        case '2': 
         $next = 60 * 60 * 24 * 7 * $bwpsoptions['backup_time']; 
         break; 
       } 

       if (($lastbackup == '' || $nextbackup < time()) && get_transient('bit51_bwps_backup') === false) { 

        $bwpsoptions['backup_last'] = time(); 

        if ($lastbackup == '') { 

         $bwpsoptions['backup_next'] = (time() + $next); 

        } else { 

         $bwpsoptions['backup_next'] = ($lastbackup + $next); 

        } 


        update_option($this->primarysettings, $bwpsoptions); 

        $this->execute_backup(); //execute backup 

       } 

      } 

     } 
+3

Установите поле в базе данных, указывающее время, и вычислите его так, чтобы, если разница между последним запуском сценария и текущим временем больше, чем 't', не запускайте скрипт. –

+0

Где вы заполняете '$ bwpsoptions'? Если это не внешний источник, например база данных, файл, сеанс и т. Д., То он будет забыт при загрузке следующей страницы. –

ответ

1

Сохраните последнюю резервную дату/время в каком-либо внешнем файле на сервере или в базе данных и используйте проверку на это значение!

+0

Пробовал. На занятом сайте механизм блокировки файлов просто не достаточно быстрый ... –

+0

Почему бы не создать этот сценарий резервного копирования на отдельной странице? и просто позвоните, чтобы начать/включить страницу, когда условие выполнено! – hjpotter92

+1

@ChrisWiegman, ** A ** был «внешним файлом на сервере или * в базе данных *». У вас не будет этой проблемы, если вы используете строку/таблицу batchQ в вашем D/B. Просто обновите время в строке временной метки резервного копирования, где время = request_time. Если затронутые строки для этого выполнения обновления == 1, то этот процесс выполняет резервное копирование, иначе какой-то другой процесс побьет его. – TerryE

2
  • Создайте файл в начале кода.
  • Когда код завершает работу, удалите файл.
  • В начале кода убедитесь, что файл не существует перед запуском.

Вид как блокировка apt-get в Linux.

+0

Я пробовал, но это просто не достаточно быстро на занятом сайте. –

+0

Как быстро запрашивается этот скрипт? –

0

Я предполагаю, что эта резервная вещь делает резервную копию где-то.

Итак, проверьте метаданные на последней резервной копии, и если время создания в прошлом недостаточно, не делайте резервной копии.

Я предполагаю, что есть веская причина, почему это не работа на cron?

+0

Да, это не работа cron, потому что слишком много людей просто не могут справиться с этим. Я должен использовать это в среде, где фактическое задание cron недоступно, и wp-cron недостаточно гибкий. –

3

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

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

define("BACKUP_PROBABILITY", 10); 
if (mt_rand(0, BACKUP_PROBABILITY) == 0) 
    doBackup(); 

Вы можете увеличить максимум (10), если ваш сайт очень часто посещается.

Если в этих 10 посещениях ни один не получил 0, следующие 10 посетителей получат свой шанс.

Вам понадобится, конечно, какой-то механизм блокировки, и по-прежнему возможно (хотя и неправдоподобно), что у вас будет более одного или даже 10 резервных копий.

Я нашел этот вопрос о мьютексах (замках) в PHP. Может быть полезно: PHP mutual exclusion (mutex)

Смежные вопросы