Php парсинг html, с помощью simple html dom
Содержание:
- Получение содержимого сайта в командной строке
- Присвоение уже назначенной буквы раздела
- How to access the HTML element’s attributes?
- Motorola Moto G8 Plus
- Парсеры сайтов по способу доступа к интерфейсу
- Реализация парсера на PHP
- How to traverse the DOM tree?
- Private Tunnel
- Usage
- Парсинг постраничной навигации и получение ссылки на следующую страницу
- Получение в cURL страниц со сжатием
- Version 4.4.0 (2020-04-10)
- Истории успешных бизнесменов
- Using Your Own Custom regexes.php File
- License
- Системный реестр
- Сервис яндекс картинки. Инструкция по поиску и скачиванию картинок
- About WhichBrowser
- Our Sponsors
- cURL и аутентификация в веб-формах (передача данных методом GET и POST)
- Разбор файла в PHP — выводы
Получение содержимого сайта в командной строке
Самым простым способом получения содержимого веб-страницы, а точнее говоря, её HTML кода, является команда вида:
curl ХОСТ
В качестве ХОСТа может быть адрес сайта (URL) или IP. На самом деле, curl поддерживает много разных протоколов – но здесь мы говорим именно о сайтах.
Пример:
curl https://hackware.ru/
Хорошей практикой является заключать URL (ссылки на сайты и на страницы) в одинарные или двойные кавычки, поскольку эти адреса могут содержать специальные символы, имеющие особое значение для Bash. К таким символам относятся амперсант (&), решётка (#) и другие.
Чтобы в командной строке присвоить полученные данные переменной, можно использовать следующую конструкцию:
HTMLCode="$(curl https://hackware.ru/)" echo "$HTMLCode"
Здесь
HTMLCode – имя переменной (обратите внимание, что при присвоении (даже повторном) имя переменной пишется без знака доллара ($), а при использовании переменной, знак доллара всегда пишется.
=»$(КОМАНДА)» – конструкция выполнения КОМАНДЫ без вывода результата в консоль; результат выполнения команды присваивается переменной
Обратите внимание, что ни до, ни после знака равно (=) нет пробелов – это важно, иначе возникнет ошибка.. Также полученное содержимое веб-страницы зачастую передаётся по трубе для обработке в других командах:
Также полученное содержимое веб-страницы зачастую передаётся по трубе для обработке в других командах:
КОМАНДА1 | КОМАНДА2 | КОМАНДА3
Реальные примеры даны чуть ниже.
Присвоение уже назначенной буквы раздела
Такого типа проблема встречается довольно часто. Это происходит при подключении SD карты к компьютеру, система присваивает ей туже букву, что и существующему разделу, из-за этого происходит конфликт и мы не видим нашу флешку в перечне дисков компьютера.
Для того чтобы устранить такого типа проблему открыть раздел «Управления компьютером» выше описан способ открытия этого раздела.
После попадания в раздел «Управления дисками» нам необходимо найти нашу флешку, ориентируйтесь на её объем, выбираем диск, совпадающий с объёмом нашей Micro SD карты. Нажимаем по нему правой кнопкой мыши и в выпавшем меню выбираем пункт «Изменить букву диска или путь к диску …».
Откроется окно, в котором нам необходимо нажать кнопку «Добавить».
В открывшемся окне выбираем букву этому разделу и нажимаем «ОК».
Готово, мы задали букву нашему разделу, теперь проверяем его наличие в проводнике.
How to access the HTML element’s attributes?
$value = $e->href;
$e->href = ‘my link’;
$e->href = null;
if(isset($e->href))
echo ‘href exist!’;
$html = str_get_html(«<div>foo <b>bar</b></div>»);
$e = $html->find(«div», );
echo $e->tag;
echo $e->outertext;
echo $e->innertext;
echo $e->plaintext;
Attribute Name | Usage |
---|---|
$e->tag | Read or write the tag name of element. |
$e->outertext | Read or write the outer HTML text of element. |
$e->innertext | Read or write the inner HTML text of element. |
$e->plaintext | Read or write the plain text of element. |
echo $html->plaintext;
$e->outertext = ‘<div class=»wrap»>’ . $e->outertext . ‘<div>’;
$e->outertext = »;
$e->outertext = $e->outertext . ‘<div>foo<div>’;
$e->outertext = ‘<div>foo<div>’ . $e->outertext;
Motorola Moto G8 Plus
-
Дисплей: 6,3 дюйма, FHD+, IPS
-
Процессор: Snapdragon 665
-
Память: 4/64 Гб
-
ЦАП: отсутствует
-
Батарея: 4000 мАч
Цена: от 16 000 руб.
Бюджетные смартфоны довольно редко оснащаются стереодинамиками, но модель от Motorola в этом плане стала приятным исключением. Аппарат имеет действительно качественное звучание. Смотреть на нем фильмы или слушать музыку без наушников вполне комфортно. На этом фишки модели не закончились – есть защита от брызг P2i, NFC, разъем 3,5 и тройная камера 48+5+16 Мп. Фронтальная камера – 25 Мп.
Достоинства:
-
Быстрая зарядка.
-
Качественная фотокамера и интересные режимы для съемки.
-
Есть NFC.
-
Приятное звучание.
-
Защита от брызг.
-
Неплохая производительность.
Недостатки:
-
Смартфоны Motorola всегда внешне отличались от конкурентов, G8 Plus – это типичный девайс с Андроид без ярко-выраженных особенностей.
-
Комбинированный слот.
-
Маркий корпус.
Парсеры сайтов по способу доступа к интерфейсу
Облачные парсеры
Облачные сервисы не требуют установки на ПК. Все данные хранятся на серверах разработчиков, вы скачиваете только результат парсинга. Доступ к программному обеспечению осуществляется через веб-интерфейс или по API.
Примеры облачных парсеров с англоязычным интерфейсом:
- http://import.io/,
- Mozenda (есть также ПО для установки на компьютер),
- Octoparce,
- ParseHub.
Примеры облачных парсеров с русскоязычным интерфейсом:
- Xmldatafeed,
- Диггернаут,
- Catalogloader.
У всех сервисов есть бесплатная версия, которая ограничена или периодом использования, или количеством страниц для сканирования.
Программы-парсеры
ПO для парсинга устанавливается на компьютер. В подавляющем большинстве случаев такие парсеры совместимы с ОС Windows. Обладателям mac OS можно запускать их с виртуальных машин. Некоторые программы могут работать со съемных носителей.
Примеры парсеров-программ:
- ParserOK,
- Datacol,
- SEO-парсеры — Screaming Frog, ComparseR, Netpeak Spider и другие.
Реализация парсера на PHP
Пожалуй, самый ответственный момент в нашем случае — это поиск донора, то есть сайта, на котором будет появляться интересующая нас информация. Сайт должен работать бесперебойно, выполнять свои обязанности по обновлению информации исправно и текст должен быть открытый (то есть, открыв исходный код страницы в браузере — мы должны видеть там интересующую нас информацию).
Когда сайт-донор и нужная нам страница для парсинга найдена, запоминаем ее урл и переходим к следующему этапу. Создаем в блокноте текстовый файл, например parser.php и помещаем в него следующий код:
<?php //откуда будем парсить информацию $content = file_get_contents('полный урл страницы с http:// с которого будем вырезать информацию'); // Определяем позицию строки, до которой нужно все отрезать $pos = strpos($content, 'здесь кусок кода/текста который размещен перед нужным текстом'); //Отрезаем все, что идет до нужной нам позиции $content = substr($content, $pos); // Точно таким же образом находим позицию конечной строки $pos = strpos($content, 'здесь кусок кода/текста который стоит в конце нужного нам текста'); // Отрезаем нужное количество символов от нулевого $content = substr($content, 0, $pos); //если в тексте встречается текст, который нам не нужен, вырезаем его $content = str_replace('текст который нужно вырезать','', $content); // выводим спарсенный текст. echo $content; echo "вставляем сюда завершающий код"; ?>
Итак, какие-то 8 строчек кода и сторонний контент автоматически публикуется на нашем блоге. Красным цветом в коде обозначены места, которые вы обязательно должны отредактировать, зеленым цветом — при необходимости. Если необходимости нет, то можно просто удалить эти строчки или запретить им обрабатываться (я про строчки в которых зеленый текст) — ставим перед строчкой два слеша — //
Нужны пояснения к кускам кода/текста, которые обрамляют нужный нам текст? Тут все просто, мы должны указать начальную и конечную позицию в тексте, который нужно парсить. Открываем исходную страницу на сайте-доноре и ищем нужный нам текст. Как правило, он будет начинаться с какой нибудь html-разметки, что-то типа этого — <td><p><strong><em> и заканчиваться такой же абракадаброй — например, </td><td> </td><td> </td></tr>. Копируем эти символы в начальную и конечную позиции (2 и 3 красная строчки). Помним, наш скрипт спарсит текст, который находится между этими позициями на сайте.
parser.php готов. Копируем его в корень своего сайта и запускаем в браузере http://мой сайт/parser.php. Если вы все сделали правильно, вы увидите вырезанный/спарсенный кусок текста. Разумеется, он индексируется и не содержит никаких следов того, что вы его забрали с другого сайта.
How to traverse the DOM tree?
echo $html->find(«#div1», 0)->children(1)->children(1)->children(2)->id;
echo $html->getElementById(«div1»)->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute(‘id’);
You can also call methods with .
Method | Description |
---|---|
mixed$e->children ( ) | Returns the Nth child object if index is set, otherwise return an array of children. |
element$e->parent () | Returns the parent of element. |
element$e->first_child () | Returns the first child of element, or null if not found. |
element$e->last_child () | Returns the last child of element, or null if not found. |
element$e->next_sibling () | Returns the next sibling of element, or null if not found. |
element$e->prev_sibling () | Returns the previous sibling of element, or null if not found. |
Private Tunnel
Usage
Add php-css-parser to your composer.json
{ "require": { "sabberworm/php-css-parser": "*" } }
Extraction
To use the CSS Parser, create a new instance. The constructor takes the following form:
new Sabberworm\CSS\Parser($sText);
To read a file, for example, you’d do the following:
$oCssParser = new Sabberworm\CSS\Parser(file_get_contents('somefile.css')); $oCssDocument = $oCssParser->parse();
The resulting CSS document structure can be manipulated prior to being output.
Options
Charset
The charset option is used only if no @charset declaration is found in the CSS file. UTF-8 is the default, so you won’t have to create a settings object at all if you don’t intend to change that.
$oSettings = Sabberworm\CSS\Settings::create()->withDefaultCharset('windows-1252'); new Sabberworm\CSS\Parser($sText, $oSettings);
Strict parsing
To have the parser choke on invalid rules, supply a thusly configured Sabberworm\CSS\Settings object:
$oCssParser = new Sabberworm\CSS\Parser(file_get_contents('somefile.css'), Sabberworm\CSS\Settings::create()->beStrict());
Disable multibyte functions
To achieve faster parsing, you can choose to have PHP-CSS-Parser use regular string functions instead of functions. This should work fine in most cases, even for UTF-8 files, as all the multibyte characters are in string literals. Still it’s not recommended to use this with input you have no control over as it’s not thoroughly covered by test cases.
$oSettings = Sabberworm\CSS\Settings::create()->withMultibyteSupport(false); new Sabberworm\CSS\Parser($sText, $oSettings);
Manipulation
The resulting data structure consists mainly of five basic types: , , , and . There are two additional types used: and which you won’t use often.
CSSList
represents a generic CSS container, most likely containing declaration blocks (rule sets with a selector) but it may also contain at-rules, charset declarations, etc. has the following concrete subtypes:
- – representing the root of a CSS file.
- – represents a subsection of a CSSList that only applies to a output device matching the contained media query.
To access the items stored in a – like the document you got back when calling –, use , then iterate over that collection and use instanceof to check whether you’re dealing with another , a , a or a .
To append a new item (selector, media query, etc.) to an existing , construct it using the constructor for this class and use the method.
is a container for individual rules. The most common form of a rule set is one constrained by a selector. The following concrete subtypes exist:
- – for generic at-rules which do not match the ones specifically mentioned like @import, @charset or @media. A common example for this is @font-face.
- – a RuleSet constrained by a ; contains an array of selector objects (comma-separated in the CSS) as well as the rules to be applied to the matching elements.
Note: A can contain other s (and s as well as a ) while a can only contain s.
If you want to manipulate a , use the methods , and (which accepts either a Rule instance or a rule name; optionally suffixed by a dash to remove all related rules).
Value
is an abstract class that only defines the method. The concrete subclasses for atomic value types are:
- – consists of a numeric value and a unit.
- – colors can be input in the form #rrggbb, #rgb or schema(val1, val2, …) but are always stored as an array of (‘s’ => val1, ‘c’ => val2, ‘h’ => val3, …) and output in the second form.
- – this is just a wrapper for quoted strings to distinguish them from keywords; always output with double quotes.
- – URLs in CSS; always output in URL(«») notation.
There is another abstract subclass of , . A represents a lists of s, separated by some separation character (mostly , whitespace, or ). There are two types of s:
- – The default type, used to represent all multi-valued rules like (where the value would be a whitespace-separated list of the primitive value , a slash-separated list and a comma-separated list).
- – A special kind of value that also contains a function name and where the values are the function’s arguments. Also handles equals-sign-separated argument lists like .
Convenience methods
There are a few convenience methods on Document to ease finding, manipulating and deleting rules:
- – does what it says; no matter how deeply nested your selectors are. Aliased as .
- – does what it says; no matter how deeply nested your rule sets are.
- – finds all objects inside s.
Парсинг постраничной навигации и получение ссылки на следующую страницу
Напишем новую функцию и по традиции разберём её позже
function getNextLink($link){ $url="https://www.bing.com/search"; $content= file_get_contents($url.$link); libxml_use_internal_errors(true); $mydom = new DOMDocument(); $mydom->preserveWhiteSpace = false; $mydom->resolveExternals = false; $mydom->validateOnParse = false; $mydom->loadHTML($content); $xpath = new DOMXpath($mydom); $page = $xpath->query("//*/../following::li/a"); foreach ($page as $p){ $nextlink=$p->getAttribute('href'); } return $nextlink; }
Почти идентичная функция, изменился только xpath запрос. получаем элемент с классом ( это класс активной
кнопки постраничной навигации), поднимаемся на элемент вверх по dom дереву, получаем первый соседний элемент и получаем в нём ссылку. Эта и есть ссылка на
следующую страницу.
Получение в cURL страниц со сжатием
Иногда при использовании cURL появляется предупреждение:
Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.
Его можно увидеть, например при попытке получить страницу с kali.org,
curl https://www.kali.org/
Суть сообщения в том, что команда curl выведет бинарные данные, которые могут навести бардак в терминале
Нам предлагают использовать опцию «—output -» (обратите внимание на дефис после слова output – он означает стандартный вывод, т.е. показ бинарных данных в терминале), либо сохранить вывод в файл следующим образом: «—output «.
Причина в том, что веб-страница передаётся с использованием компрессии (сжатия), чтобы увидеть данные достаточно использовать опцию —compressed:
curl --compressed https://www.kali.org/
В результате будет выведен обычный HTML код запрашиваемой страницы.
Version 4.4.0 (2020-04-10)
Added
- Added support for passing union types in builders.
- Added end line, token position and file position information for comments.
- Added method to nodes.
Fixed
- Fixed generation of invalid code when using the formatting preserving pretty printer, and
inserting code next to certain nop statements. The formatting is still ugly though. -
no longer requires that the very last comment before a node be a doc comment.
There may not be non-doc comments between the doc comment and the declaration. - Allowed arbitrary expressions in and , rather than just variables.
In particular, this allows , which is legal PHP code.
Истории успешных бизнесменов
Далее будут кратко изложены вдохновляющие биографии четырех ныне живущих, добившихся успеха, всемирно известных деловых людей:
Сергей Брин
Успешный предприниматель, ученый в области вычислительной техники, сооснователь поисковой системы Google, миллиардер. Родился в Москве в небогатой семье ученых-математиков, позже с родителями переехал в США.
Успех пришел к молодому человеку, когда он стал заниматься разработкой поисковой машины (системы) в Стэнфордском университете вместе с Лари Пейджем (в настоящее время также миллиардер).
Придуманную поисковую систему студенты успешно проверили в университете, после чего стали искать инвесторов для дальнейшего развития бизнеса и нашли их. Уже через семь лет имена молодых основателей Google появились в списке миллиардеров журнала Forbes.
Марк Цукерберг
Успешный программист, предприниматель в области интернет-технологий, основатель и разработчик социальной сети Facebook, миллиардер. Родился в небогатой многодетной семье.
Уже в школьные годы увлекался компьютерным программированием и стал называть себя «хакером по призванию». Марк разрабатывал свою социальную сеть вместе с друзьями в Гарварде, финансовую помощь им оказывал студент Эдуардо Северин, позже стали появляться и другие более крупные инвесторы и успех не заставил себя ждать.
Опра Уинфри
Успешная американская телеведущая, актриса, общественный деятель, создавшая свою продюсерскую компанию, а также первая афроамериканка, попавшая в список Forbes, женщина-миллиардер.
Родилась в неблагополучной семье шахтера и горничной. Несмотря на очень тяжелое детство и юность, смогла быстро добиться успеха упорным трудом. Благодаря пробивному характеру и деятельному желанию в 19 лет Опра стала ведущей новостей, позже начала вести ток-шоу. В 32 года она стала миллионером, а в 40 лет – миллиардером. Сегодня Уинфри, помимо всего прочего, успешный медиамагнат, владелица киностудии, журнала, радиосети, кабельного телеканала.
Джоан Роулинг
Британка, чью жизнь до оглушительного успеха нельзя было назвать счастливой, стартовала в бизнесе с абсолютного нуля и стала успешной всемирно известной писательницей благодаря серии романов о Гарри Поттере.
За пять лет Джоан прошла путь от бедности (жила на социальное пособие) до своего первого миллиарда. Сегодня она сценарист, кинопродюсер, наиболее продающийся автор в Великобритании.
Using Your Own Custom regexes.php File
License
PHP-CSS-Parser is freely distributable under the terms of an MIT-style license.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the «Software»), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Системный реестр
Чуть сложнее и дольше сменить адрес адаптера вариантом 2 — в системном реестре. Как и диспетчер устройств, открыть его можно несколькими способами. Например, введя команду «regedit» в окне, вызываемом по Win+R.
Откроется редактор реестра, в котором прописаны все параметры уставленной ОС. Работать надо внимательно и аккуратно. Сделать твик (так называют изменение реестра) нужно в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}.
Тут прописаны все устройства, которые нашла ОС при установке. Их реальные имена, адреса, драйвера и прочая информация. Комбинация цифр в конце отвечает за сетевые устройства в системе.
Надо последовательно проверить папки 0000, 0001… 0003. Параметр «DriverDesc» укажет реальное название сетевой карты.
Найдя раздел нужной, переходим к параметру NetworkAddress.
Значение, указанное в нём, подменяет собой аппаратный адрес устройства. Иногда параметр отсутствует, но его можно создать. На запрос реестра о типе указать «строковый». Указывая его значение, изменяем МАС-адрес компьютера.
После этого нужно перезагрузить сетевой адаптер.
Сервис яндекс картинки. Инструкция по поиску и скачиванию картинок
About WhichBrowser
But why almost completely useless and not completely useless?
Well, there is always an exception to the rule. There are valid reasons to do browser sniffing: to improve the user experience or to gather intelligence about which browsers are used on your website. My website is html5test.com and I wanted to know which score belongs to which browser. And to do that you need a browser sniffing library.
Why is it extremely complicated?
Because everybody lies. Seriously, there is not a single browser that is completely truthful. Almost all browsers say they are Netscape 5 and almost all WebKit browsers say they are based on Gecko. Even Internet Explorer 11 now no longer claims to be IE at all, but instead an unnamed browser that is like Gecko. And it gets worse. That is why it is complicated.
What kind of information does it give?
You get a nice object which has information about the browser, rendering engine, os and device. It gives you names and versions and even device manufacturer and model. And WhichBrowser is pretty tenacious. It gives you info that others don’t. For example:
Android is never mentioned
Despite the useragent header claiming to be a Series40 device, we know it’s actually running the Asha Platform and we also know that OviBrowser has been renamed to Nokia Xpress.
The useragent header looks like Opera 11.10 on Linux, but we know it’s Opera Mini. We can even figure out the real operating system and device model from other headers.
Our Sponsors
Our backers and sponsors help to ensure the quality and timely development of the Parse Platform.
Parse Server works with the Express web application framework. It can be added to existing web applications, or run by itself.
cURL и аутентификация в веб-формах (передача данных методом GET и POST)
Аутентификация в веб-формах – это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.
Использование curl для получения страницы после HTTP аутентификации очень сильно различается в зависимости от конкретного сайта и его движка. Обычно, схема действий следующая:
1) С помощью Burp Suite или Wireshark узнать, как именно происходит передача данных. Необходимо знать: адрес страницы, на которую происходит передача данных, метод передачи (GET или POST), передаваемая строка.
2) Когда информация собрана, то curl запускается дважды – в первый раз для аутентификации и получения кукиз, второй раз – с использованием полученных кукиз происходит обращение к странице, на которой содержаться нужные сведения.
Используя веб-браузер, для нас получение и использование кукиз происходит незаметно. При переходе на другую страницу или даже закрытии браузера, кукиз не стираются – они хранятся на компьютере и используются при заходе на сайт, для которого предназначены. Но curl по умолчанию кукиз не хранит. И поэтому после успешной аутентификации на сайте с помощью curl, если мы не позаботившись о кукиз вновь запустим curl, мы не сможем получить данные.
Для сохранения кукиз используется опция —cookie-jar, после которой нужно указать имя файла. Для передачи данных методом POST используется опция —data. Пример (пароль заменён на неверный):
curl --cookie-jar cookies.txt http://forum.ru-board.com/misc.cgi --data 'action=dologin&inmembername=f123gh4t6&inpassword=111222333&ref=http%3A%2F%2Fforum.ru-board.com%2Fmisc.cgi%3Faction%3Dlogout'
Далее для получения информации со страницы, доступ на которую имеют только зарегестрированные пользователи, нужно использовать опцию -b, после которой нужно указать путь до файла с ранее сохранёнными кукиз:
curl -b cookies.txt 'http://forum.ru-board.com/topic.cgi?forum=35&topic=80699&start=3040' | iconv -f windows-1251 -t UTF-8
Эта схема может не работать в некоторых случаях, поскольку веб-приложение может требовать указание кукиз при использовании первой команды (встречалось такое поведение на некоторых роутерах), также может понадобиться указать верного реферера, либо другие данные, чтобы аутентификация прошла успешно.
Разбор файла в PHP — выводы
Как я уже и говорил в начале, мои опыты не являются безупречными и опираться исключительно на полученные в их ходе результаты не стоит, т.к., несмотря на быстродействие file_get_contents() в моей ситуации, бывают случаи, когда намного удобнее и эффективнее использовать другие приведённые мною PHP парсеры файлов.
Кроме того, не стоит забывать, что PHP сам по себе является синхронным языком программирования, т.е. все серверные операции происходят последовательно без возможности настройки их параллельного выполнения, в том числе, и на разных ядрах серверного процессора.
Следовательно, на время выполнения операций, прописанных в PHP коде, может влиять целый ряд факторов, среди которых основным является нагруженность ядра в момент работы PHP приложения.
Я это особенно ощутил во время проведения опытов, когда один и тот же PHP парсер файла отработал за 9, затем за 12, а потом снова за 9 секунд на трёх последовательных итерациях из-за банального запуска проводника Windows во время второго случая, который, естественно, тоже требует серверных ресурсов.
Учитывая данные особенности, я проводил эксперименты практически одновременно, друг за другом, при одинаковом комплекте запущенных программ, чтобы не распылять ресурсы серверного железа.
Поэтому в дальнейшем, при проведении подобных экспериментов с PHP конструкциями действуйте аналогичным образом, т.к. это, по сути, единственный способ привести эксперименты к равным условиям.
Если же вы будете работать с асинхронными серверными языками (C#, Java) или технологиями (Node.js, например), то, по возможности, для экспериментов создавайте отдельный поток, который будет работать на выделенном ядре процессора.
Ну, а если найти полностью незадействованное ядро не получится (что при уровне современного ПО не удивительно), то вы хотя бы сможете найти самое слабонагруженное или, хотя бы, со статической нагрузкой, которая не меняется во времени.
Надеюсь, что мои наблюдения и рекомендации будут вам полезны, равно как и мои сегодняшние эксперименты с PHP парсерами файлов.
Подытоживая, хочу сказать, что приведённые в статье фрагменты кода могут использоваться не только для парсинга текстовых файлов в PHP, но и отлично подойдут для других форматов, например, для разбора CSV файлов дампа базы данных MySQL.
До новых встреч!