Я пишу PHP последние 3,5 года, и мне это нравится.Когда появилось недавнее жужжание PHP v / s Nodejs , одна вещь, которая всегда была в центре внимания, это то, что Nodejs реализовал неблокирующий (или асинхронный) ввод / вывод по умолчаниюа PHP нет.
Однако, когда я недавно попытался реализовать простой маршрутизатор асинхронных запросов в PHP (используя функцию exec () ) и попытался сопоставить мой код со стандартным (предположительно, синхронным сценарием обработчика запросов),Я заметил что-то странное.
Прежде чем продолжить объяснение, я хотел бы, чтобы вы ознакомились с кодом ниже.
sync.php : тот, который должен отложить все дальнейшие запросы до тех пор, пока текущий не завершит обработку :
<?php
$a = $argv[1];
echo "starting: ".$a;
$ar = array();
$sum = 0;
$ul = 15000;
for($i = 1; $i < $ul; $i++){
$ar[$i] = $i;
}
for($i = 1; $i < $ul; $i++){
for($j = 1; $j < $ul; $j++){
$sum += $ar[$j];
}
}
echo "\n\nDone: ".$a."\nResult: ".$sum."\n";
?>
Я сделал два вида тестов.
Сначала я запустил четыре экземпляра терминала на моем компьютере и выполнил:
php sync.php 1
во всех них одновременно .
Затем я включил свой сервер XAMPP, выставил свой локальный хост через serveo и сделал три запроса с трех разных устройств к этому сценарию одновременно.
РЕЗУЛЬТАТЫ НЕ ОЖИДАЛИСЬ.
Независимо от того, сколько запросов я отправляю, все они (кажется) выполняются параллельно, и результат отображается (почти) во всех окнах терминала / на вкладках браузера (почти) одновременно (учитывая 1-2-секундная задержка, возникающая при ручном запуске команд в каждом окне терминала).
Это не соответствует тому факту, что PHP реализует блокировку ввода / вывода (это то, что происходит со мной).Вместо этого я ожидал получить общее время пакета
n * 4 seconds
, где n - время, необходимое для обработки каждого запроса (примерно 8 секунд на моем ноутбуке).
Итак, почему запросы обрабатываются асинхронно ??Это потому, что for loop является одной из функций, которые выполняются асинхронно, или она вообще не имеет отношения к блокирующей модели ввода / вывода ??