2009-09-04 3 views
1

Я знаю, что это немного общего, но я уверен, что вы поймете мое объяснение. Вот ситуация:Как восстановить этот скрипт после сбоя оборудования?


Следующий код используется каждые 10 минут. Переменная «var_x» всегда считывается/записывается во внешний текстовый файл, когда его ссылаются на.

if (var_x != 1) 
{ 
    var_x = 1; 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    var_x = 0; 
} 
else 
{ 
    // exit script as it's already running. 
} 

Проблема: если я имитировать отказ аппаратных средств (сделать жесткий сброс, когда скрипт выполняющийся), то главный логический сценарий никогда не будет выполнять снова, потому что «var_x» всегда будет «1» , (У меня уже есть логика для выработки точки восстановления).

Спасибо.

+0

По какой-то причине Flock, похоже, не работает для меня. Flock, похоже, только задерживает код до тех пор, пока файл не станет свободным, что не то, что я хочу. – Cheetah

ответ

6

Вы должны блокировать и разблокировать файлы с flock:

$fp = fopen($your_file); 
if (flock($fp, LOCK_EX)) {) 
{ 
    // 
    // here is where the main body of the script is. 
    // it can take hours to completely execute. 
    // 
    flock($fp, LOCK_UN); 
} 
else 
{ 
    // exit script as it's already running. 
} 

Edit:

Как стадо, кажется, не правильно работайте на машинах Windows, вам нужно прибегнуть к другим решениям. В верхней части моей головы появилась идея для возможного решения:

Вместо того чтобы писать 1 в var_x, напишите идентификатор процесса, полученный с помощью getmypid. Когда новый экземпляр скрипта читает файл, он должен искать выполняющийся процесс с этим идентификатором, и если этот процесс является скриптом PHP. Конечно, это все равно может пойти не так, поскольку существует вероятность того, что другой PHP-скрипт получит тот же PID после сбоя оборудования, поэтому решение далеко не оптимальное.

+0

+1 для ваших усилий – Dooltaz

+0

еще один +1. Спасибо за помощь. – Cheetah

+0

Не могу проголосовать :(не достаточно репутации – Cheetah

0

Похоже, вы выполняете ручную семафор для управления процессом.

Вместо записи в файл, возможно, вы должны использовать вместо него environment variable. Таким образом, в случае сбоя ваш скрипт не будет иметь закрытый семафор при восстановлении.

+0

from PHP.net: 'Предупреждение: Эти директивы действуют только в том случае, если включен режим безопасного режима!' – scragar

+0

true, ответ scragar намного лучше для PHP. Я думал только в общем. –

5

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

http://php.net/flock

+0

Сверху моей головы (думая об этом) - отлично. – Cheetah

+0

Вы избили меня, пока я написал код;) – Residuum

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