Попытка сбора этих данных описанными вами способами приводит к проблемам масштабирования с истечением срока действия кэша, чтобы избежать OOM или длительного времени итерации, поскольку число записей увеличивается, когда вы в конечном итоге хотите сохранить базу данных.Информация, которую вы хотите объединить, уже записана в журналах веб-сервера.Парсинг это простое занятие, вам просто нужно написать алгоритм, который знает, как и когда происходит это опрокидывание.
Используйте log = fileRead('log.txt', 'read')
и периодически повторяйте line fileReadLine(log)
с помощью <cfschedule/>
.Для каждого пакета вы можете, как вы уже описали, и затем использовать любой подход к базе данных для INSERT / UPDATE (обычно используется ключевое слово MERGE, но MySQL отличается) на основе IP-адреса, если вы это 'после.Если это сайт с очень высоким трафиком, рассмотрите возможность изменения типа данных столбца IP-адреса на целочисленный тип данных для ускорения поиска в индексе.
Обновление
Используйте следующий код для установки ссылки на объект файла:
<cflock name="logparser" type="exclusive" timeout="1" throwontimeout="false">
<cfif NOT structKeyExists(application, "logFile")>
<cfset application.logFile =
fileOpen('/path/to/log.txt', 'read')>
</cfif>
<cfloop condition="NOT FileisEOF(application.logFile)">
<!--- replace with an appropriate algorithm --->
<cfoutput>
#fileReadLine(application.logFile)#
<br />
</cfoutput>
</cfloop>
</cflock>
Выполнение этого устанавливает ссылку один раз (т. Е. fileOpen()
), которая отслеживает, на какой строке он находится.Затем, когда <cfschedule/>
снова попадает в этот код, он использует существующую ссылку, если она есть, и выполняет итерацию вперед оттуда.Блокировка гарантирует, что только один поток выполняет алгоритм - так что вам не нужно беспокоиться о временном ограничении, просто дайте ему продолжаться столько времени, сколько потребуется.