js создает соединение (в опциях для ajax запроса выставляется таймаут побольше)
php принимает его и смотри что можно послать. И ждет... ждет пока не появятся данные которые можно послать.
Как только данные появляются (скажем скрипт с какой-то задержкой читает данные из базы или из очереди) то он отправляет эти данные и обрывает соединение.
js скрипт принимает данные, отдает данные на обработку и создает новое соединение.... и так до бесконечности.
По сути просто вместо того что бы опрашивать сервер раз в секунду, создается соединение, живущее только до получения данных. После получения данных соединение закрывается. После закрытия соединения (не важно пришли данные или произошла ошибка/разрыв по таймаут) так же создается новое. На практике таймаут выставляют секунд в 20-30 что бы избежать возможных проблем.