Поставьте счётчик на количество активных.
При вызове - прибавляете 1.
При останове - отнимаете 1.
И условие, контролирующее очередной запуск в зависимости от нужного количества.
Нужно только один - сравнение с единицей и т.д.
Возможно, что там происходит race-condition или "состояние гонки".
Попробуйте избавиться от yield и присваивать через переменные все промежуточные значения.
Самый простой способ проверить: две проверки подряд без цикла с промежуточными переменными и сразу после каждой - var_dump всех переменных.
Коды ответа удалённого сервера - желательно тоже получить.
На крайний случай - сниффер и анализ пакетов: возможно на удалённом сервере установлен лимит на параллельные подключения.
На сервере - это запуск дочернего php-процесса через php-менеджер очереди по запросу на парсинг с выводом прогресса в unix-сокет при подключении клиента - другого php-скрипта, который стартует уже по запросу из браузера и подключается к скрипту-парсеру.
На клиенте (в браузере, js) - контроль соединения: авто-реконнект при потере связи.
Запускайте сторонний код через дополнительный процесс под другим пользователем и ограничьте этому пользователю все права кроме тех, которые нужны для корректного функционирования закрытого кода.
Но мне очень интересно каким образом проекты начинают жестко "вируситься" по сети.
Это ответ!
Вложение инвесторов в рыночное продвижение НУЖНОГО ИМ проекта - это как посев зерна.
Нанимаются люди, которые заключают договора с крупными PR-агенствами и понеслось, а потом постоянно собирают нехилые проценты с дохода приложения или, что ещё хуже, всю интересную метрику (BigData), которую затем, перепродают дальше.
(доступно?!)