У меня есть приложение 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, я могу хранить широкий спектр клиентских устройств.
Я не думаю, что здесь достаточно информации, слишком много систем и слишком мало информации. только я могу думать о том, что это проблема параллелизма.
Если вы пишете в файл на диске, что произойдет, если два запроса поступят одновременно? Если вы читаете, а затем пишете, второй запрос может быть перезаписан первым. Например:
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, поле не будет обновлено, что я могу наблюдать и обрабатывать в коде.
Документация PHP для fwrite говорит, что это атомарное действие — либо все должно быть написано, либо ничего не должно быть написано.
Это указывает на то, что это ошибка в PHP.
Я отправил отчет об ошибке.
Есть идеи по поводу рабочих туров?
(В сегодняшних тестах ни одна из записей не была частичной. 12 пропали без вести, 17 произошли не в порядке — то есть в другом порядке, в котором заказчик отправил информацию, в общей сложности из 42).