javascript — Почему PHP-файл добавляется только успешно при 99,7% попыток

У меня есть приложение Javascript, работающее на широком спектре платформ.
(Я стараюсь сохранить как можно больший список клиентских устройств, включая ранние телефоны Android и ранние айфоны, используя caniuse.com).

Каждый раз, когда данные клиентского приложения изменяются, новые данные добавляются в простой текстовый файл журнала на сервере. Добавления представляют собой одну строку длиной от 20 до 70 символов.

Время от времени — примерно один раз из 250 — первые 6-20 символов приложения добавляются в самоволку.

Приложение JavaScript на клиентском устройстве отправляет данные с помощью XmlHttpRequest в PHP 5.5.10 на ПК с Windows, который затем записывает данные в дисковый файл на смонтированном разделе NAS (смонтирован как буква диска Windows на ПК).

PHP работает на веб-сервере Mongoose в Windows 7, а затем данные сохраняются на жестком диске на внутреннем сетевом устройстве хранения данных в сети сервера. (Устройство Debian Linux NAS) Иногда для раскрутки жесткого диска NAS может потребоваться несколько секунд.

Только одно клиентское устройство работает с любым данным простым текстовым файлом, но в любой момент времени до 10 клиентских устройств могут обращаться к своим соответствующим текстовым файлам.

Это что-то, что исчезнет, ​​если я исправлю задержки на комбинации сервер + NAS? (Например, поместив файлы локально на сервер)

Или есть способ сделать запись гарантированной, используя новые возможности? Скажем, например, записывая в таблицу SQLite, а не в простой текстовый файл, или в базу данных Couchbase, или в CouchDB, или что-то подобное.

Пока участие клиентского устройства остается простым XmlHttpRequest, я могу хранить широкий спектр клиентских устройств.

1

Решение

Я не думаю, что здесь достаточно информации, слишком много систем и слишком мало информации. только я могу думать о том, что это проблема параллелизма.

Если вы пишете в файл на диске, что произойдет, если два запроса поступят одновременно? Если вы читаете, а затем пишете, второй запрос может быть перезаписан первым. Например:

Process 1 receives data Y.
Process 2 receives data Z.
Process 1 reads data X from the disk.
Process 2 reads data X from the disk.
Process 1 writes to the disk, data is now XY
Process 2 writes to the disk, data is now XZ

В этом примере Y потерян.

Если вы используете базу данных (MySQL, Couch и т. Д.), Это должно иметь меньшее значение, если данные изменились между чтением и записью. В тех редких случаях, когда мне приходилось что-то читать и редактировать, я использую запрос по типу

UPDATE table SET data = "XY" WHERE data = "X"

Это означает, что если данные изменились после того, как я прочитал X, поле не будет обновлено, что я могу наблюдать и обрабатывать в коде.

0

Другие решения

Документация PHP для fwrite говорит, что это атомарное действие — либо все должно быть написано, либо ничего не должно быть написано.

Это указывает на то, что это ошибка в PHP.

Я отправил отчет об ошибке.

Есть идеи по поводу рабочих туров?

(В сегодняшних тестах ни одна из записей не была частичной. 12 пропали без вести, 17 произошли не в порядке — то есть в другом порядке, в котором заказчик отправил информацию, в общей сложности из 42).

0

По вопросам рекламы [email protected]