В коде для вашего «ожидающего» запроса (Пользователь A) создайте новый прослушивающий сокет (http://php.net/manual/en/sockets.examples.php), связанный с адресом и портом localhost, который не будет конфликтовать ни с чем другим (например, 127.12). 34.56 (порт 7890), затем дождитесь соединения, вызвав socket_accept. Если в этом состоянии уже есть запрос, он завершится ошибкой, иначе он будет ожидать соединения.
В вашем запросе «сигнализация» (пользователь B) создайте новый сокет и подключитесь к вашему прослушивающему сокету. Обработчик PHP, ожидающий запрос пользователя A, немедленно вернется из вызова socket_accept, в котором он был заблокирован, и вы можете продолжить. Если вам нужно передать какие-либо сообщения между ними, вы можете просто читать и записывать сообщения в и из сокетов.
Это очень распространенная задача для приложений, таких как чаты и страницы уведомлений, которые отображают отправленные сервером события. Этот подход имеет несколько преимуществ по сравнению с подходом опроса, который продолжает вызывать режим сна и проверять базу данных или файл в цикле (или делает много запросов обратно к серверу в цикле со стороны JavaScript):
- не создает ненужных HTTP-запросов, запросов к БД или циклов ЦП, которые потребляют ресурсы и сетевой трафик
-Действует немедленно, когда событие запуска происходит без задержки
-Это не зависит от БД или файла
Основным недостатком является то, что ваш PHP должен иметь разрешения для открытия сокетов и подключения к ним, что часто не имеет места в средах общего хостинга.
Например, см. https://gist.github.com/root9b/e1f0b82769296b06c079e53c7362bb94