Блокировка PHP flock создает последовательную очередь?

Будет ли блокировка
flock($fp, LOCK_EX);
создавать правильную последовательную очередь у конкурентных запросов к блокируемому файлу через этот скрипт, даже если разница между ними в миллисекунды?
  • Вопрос задан
  • 379 просмотров
Пригласить эксперта
Ответы на вопрос 2
@fomiash
Согласно такому тесту:

<?php
// Файл /test/tester.php

<?php
@unlink("/test/document.txt");
$processTime = 0.0001;
for ($i = 1; $i <= 15; $i++) {
   $processTime *= 2;
   $time = $i === 1 ? 0 : $processTime;
   if ($i === 2) {
       sleep(2);
   }
   usleep($time * 1000000);
   passthru("php /test/subject.php $i $time >> /test/log_file.log 2>&1  &");
}

<?php
// Файл /test/subject.php

$processId = $argv[1];
$processTime = $argv[2];

$fp = fopen(__DIR__ . "/document.txt", "a+");
flock($fp, LOCK_EX);
if($processId == 1) {
    sleep(15);
    $processTime = 15;
}
fwrite($fp, $processId . ': ' . $processTime . ' sec.' . "\n");
echo $processId . "\n";
flock($fp, LOCK_UN);
fclose($fp);

в /test/document.txt оказался лог:

1: 15 sec.
3: 0.0008 sec.
15: 3.2768 sec.
5: 0.0032 sec.
4: 0.0016 sec.
12: 0.4096 sec.
10: 0.1024 sec.
7: 0.0128 sec.
6: 0.0064 sec.
8: 0.0256 sec.
11: 0.2048 sec.
13: 0.8192 sec.
9: 0.0512 sec.
14: 1.6384 sec.
2: 0.0004 sec.


в /test/log_file.txt

1
3
15
5
4
12
10
7
6
8
11
13
9
14
2


Очередность не соблюдена(
Ответ написан
Комментировать
@rPman
на базе только flock сделать очередь будет сложно

существует штатный инструмент очередей с поддержкой в php - msg_get_queue (вообще семафоры в php адекватно работают только в linux)
я тут в комментариях про это писал https://qna.habr.com/q/1007515

но лучше воспользоваться более универсальными инструментами, так как очереди ос сильно лимитированы, неудобны в обращении, хотя и очень простые
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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