Как я могу заблокировать файл для защиты от нескольких запросов ajax чтения / записи одного и того же файла? - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я пытаюсь предотвратить чтение файла, если он уже существует и в нем есть содержимое. Я использую метод flock, чтобы попытаться предотвратить доступ к нему других экземпляров скрипта, но он не работает. Это проблема только для серверов с несколькими ядрами.

while ($aEvent = current($aEvents)){
    $sLockFile = '/var/tmp/'.md5($aEvent['id']).'.LCK';
    $oFile = fopen($sLockFile, 'c+');
    if (flock($oFile, LOCK_EX) && fgets($oFile) == '') {
        fwrite($oFile, 'locked');
        fclose($oFile);
    } else {
        fclose($oFile);
        next($aEvents);
        continue;
    }
    /*
     * Do stuff here.
     */
    next($aEvents);
}

Итак, из этого кода я ожидаю, что файл будет создан, заблокирован и записан, и любой запрос, который попытается впоследствии прочитать / записать файл, будет остановлен при вызове flock или пустой проверке. Когда на самом деле кажется, что если код загружен достаточным количеством запросов ajax одновременно, один и тот же файл создается / перезаписывается несколько раз. Есть ли способ обеспечить безопасность потока PHP?

1 Ответ

0 голосов
/ 14 мая 2019

Звучит так, будто вы хотите добавить бит LOCK_NB к вашему вызову flock. От стая документов :

По умолчанию эта функция будет блокироваться до тех пор, пока не будет запрошена запрошенная блокировка; это можно контролировать с помощью опции LOCK_NB

Ваш код будет блокироваться при каждом вызове на flock, пока не будет получена блокировка. Похоже, вы хотите перейти к блоку else, если блокировка существует. Если это так, вы хотите сделать это в своем коде:

<?php
if (flock($oFile, LOCK_EX | LOCK_NB) && fgets($oFile) == '')
...
...