Параллельный Fwrite в PHP?

У меня есть функция fwrite для записи журнала для отложенной вставки в базу данных.

У нас скорость посещения 20 000 посещений в час.

так что это 0,18 с за fwrite.

Мой вопрос заключается в том, возможно ли, что PHP пропустит несколько журналов, когда 2 или 3 посетителя заходят одновременно?

Если это то, как я могу сделать это одновременно?

Мой код просто нормальный Fopen fwrite fclose.

2 ответа

Решение

Я бы избежал этого на твоем месте. Если вам нужно что-то регистрировать для каждого запроса, либо используйте что-то вроде Gearman для постановки данных в очередь для последующей обработки, либо сохраните их в базе данных (или в базе данных NoSQL) для последующей обработки. Не забывайте, что базы данных были разработаны для решения этой самой проблемы. Не пытайтесь заново изобрести БД, используя файлы журналов.

Не говоря уже о том, что 0,18 с на запись, вероятно, намного дороже, чем вставка в DBM (MySQL для меня обычно возвращает записи в пределах 0,01 секунды, в зависимости от таблицы, MongoDB может быть НАМНОГО быстрее).

Как вы запускаете записи? Если с каждым запросом (1 за посещение) связан fwrite, вы не пропустите ни одного. Возможно, они могут стать медленными (э-э), так как ваш веб-сервер ставит в очередь / обрабатывает запросы (пиковый трафик), но PHP управляется запросами, поэтому при каждой загрузке страницы у вас будет выполняться fwrite.

Я говорю, что вы ничего не пропустите, потому что, если вы не сделаете какой-нибудь неблокирующий ввод / вывод, ваш скрипт будет блокироваться при вызове fwrite. Другими словами, fwrite выполнится.

У вас будут проблемы с получением какого-либо параллелизма для приложения, управляемого запросами, написанного на PHP, без каких-либо действительно прикольных вещей.

Другие вопросы по тегам