Блокировка файлов NFS в PHP

Эта работа для меня с использованием последней версии MacOS Mojave

tell application "Preview" to activate
repeat while application "Preview" is not running
    delay 0.2
end repeat
tell application "System Events"
    try
        click menu item "Show Markup Toolbar" of menu 1 of menu bar item "View" of menu bar 1 of application process "Preview"
    end try
    delay 0.5
    try
        click menu item "Show Toolbar" of menu 1 of menu bar item "View" of menu bar 1 of application process "Preview"
    end try
    delay 0.5
    repeat while not (exists of toolbar 1 of window 1 of application process "Preview")
        delay 0.2
    end repeat
    set description2 to a reference to every checkbox of toolbar 1 of window 1 of application process "Preview"
    set theCheckboxes to description of description2

    if item 1 of theCheckboxes is "Draw" then
        set checkBoxDraw to 1
    else
        set checkBoxDraw to 2
    end if
    if item 1 of theCheckboxes is "Sketch" then
        set checkBoxSketch to 1
    else
        set checkBoxSketch to 2
    end if
    delay 1
    -- Below, insert either  checkBoxSketch for "Sketch" or checkBoxDraw for "Draw" 
    click checkbox checkBoxDraw of toolbar 1 of window 1 of application process "Preview"
end tell
-- without these next following lines, the toolbar  "Draw" or "Sketch" do not appear to be selected
tell application "Preview" to tell window 1
    set visible to false
    set visible to true
end tell
delay 3
7
задан Oli 20 October 2008 в 13:36
поделиться

6 ответов

Другой грязный взлом был бы к flock() "локальный" файл, и только открывается / пишут в файл NFS, если Вы держите блокировку на локальном файле.

Править: от flock() страница:

скопление () не будет работать над NFS и многими другими сетевыми файловыми системами. Проверьте свою документацию по операционной системе на большее количество деталей.

Редактирование 2:

Конечно, там всегда использует базу данных для synchonise доступа (я предполагаю, что Ваше приложение использует дб). Это было бы настоящим хитом производительности при выполнении большого входа все же.

Если это только для входа, Вам на самом деле нужен централизованный файл журнала? Вы могли зарегистрироваться локально (и даже объединить журналы, когда они вращаются в конце дня в случае необходимости)?

2
ответ дан 6 December 2019 в 07:30
поделиться

Даже при том, что Вы не можете скапливаться (), файлы на NFS и вводе-выводе могут быть asynchroneous, операции каталога на NFS являются атомарными. Это означает, что в в любой момент времени, каталог делает или не существует.

Для реализования собственной опции блокировки NFS проверьте или создайте каталог, когда Вы хотите заблокировать ее и удалить ее, когда Вы сделаны.

К сожалению, это, вероятно, не совместимо с любым другим приложением, которое Вы не записали сами.

1
ответ дан 6 December 2019 в 07:30
поделиться

Операции каталога НЕ являются атомарными под NFSv2 и NFSv3 (отошлите к книге 'NFS, Проиллюстрированный' Brent Callaghan, ISBN 0-201-32570-5; Brent является ветераном NFS в Sun).

NFSv2 начинает две атомарных операции:

  • символьная ссылка
  • переименовать

С NFSv3 создать вызов является также атомарным.

Зная это, можно реализовать спин-блокировки для файлов и каталогов (в оболочке, не PHP):

заблокируйте текущий dir:

while ! ln -s . lock; do :; done

заблокируйте файл:

while ! ln -s ${f} ${f}.lock; do :; done 

разблокируйте (предположение, рабочий процесс действительно получил блокировку):

разблокируйте текущий dir:

mv lock deleteme && rm deleteme

разблокируйте файл:

mv ${f}.lock ${f}.deleteme && rm ${f}.deleteme

Удалите является также не атомарным, поэтому сначала переименовывание (который является атомарным), и затем удаление.

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

16
ответ дан 6 December 2019 в 07:30
поделиться

Один подход мог быть должен настроить экземпляр Кэш-памяти, совместно использованный каждым из Ваших виртуальных серверов. Вы могли обезьянничать flock() вставляя запись имени файла для кэширования, когда Вы запускаете локальные операции файла и стирание его по окончании.

Каждый сервер может получить доступ к этому пулу перед операцией файла и видеть, присутствует ли эта "блокировка", например.

// Check for lock, using $filename as key
$lock = $memcache->get($filename);

if(!$lock) {
    // Set lock in memcache for $filename
    $memcache->set($filename, 1);

    // Do file operations...

    // Blow away "lock"
    $memcache->delete($filename);
}

Не самое изящное из решений, но должен позволить Вам управлять блокировками со всех серверов в Вашей установке с относительной простотой.

3
ответ дан 6 December 2019 в 07:30
поделиться

Должен просто использовать кэш-память, добавляют и избегают состояния состязания.

if ($memcache->add($filename, 1, 1))
{
   $memcache->delete($filename);
}
0
ответ дан 6 December 2019 в 07:30
поделиться

Можно также использовать dio_fcntl() для блокировки файлов на томах NFS. Для этого требуется пакет dio, который может не быть частью вашей установки php по умолчанию.

2
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: