Как в PHP из одного потока(сессии) вызвать скрипт другого потока(сессии) скрипт другого клиента?
Требуется передавать данные клиенту используя SSE в PHP полученные в API в другом потоке другой сессии.
Как передавать данные между сессиями(потоками)?
Спасибо большое за помощь. Это то что нужно.
Но есть проблемка. Семафор возвращает ошибку, а коды ошибок ни где нету.
Вы прежде имели дело с ошибками семафоров?
Значит:
имеется 3 скрипта на сервере,
1й. API- который сохраняет в базу значения и передает в семафор события.
2й. Обычный сайт с графиками. Графики грузятся при обновлении страницы.
-После загрузки страницы сайта, JS запрашивает на сервере SSE поток.
3й. Скрипт который передает через SSE поток на страницу клиента сообщения полученные из симаффора.
PS что SSE, что семафор я начал использовать первый раз. Вот в песочнице грязный код, чтобы хоть чтото заработало.
КОД:
1й:
$id =6; // - это id графика
$stream_id = msg_get_queue($id);
$result['remove'] = msg_remove_queue($stream_id);
$stream_id = msg_get_queue($id);
$message = "{\"DevID\":$id,\"DevEUI\":\"$DevEUI\",\"payload_hex\":\"$payload_hex\"}"; // какой то JSON
$result['send'] = msg_send($stream_id, $id, $message, false, true, $err);
$result['stat'] = msg_stat_queue($stream_id);
3й:
date_default_timezone_set('Europe/Moscow'); // "America/New_York" 'Europe/Moscow'
header('Cache-Control: no-cache');
header("Content-Type: text/event-stream");
header("Connection: keep-alive");
$queue_id = msg_get_queue($id);// Такой же ID как из 1го скрипта, тот же ID для того же графика.
while (1) {
if (msg_receive ($queue_id, 1, $id, 16384, $message, false, 0, $msg_error)) {
if (in_array(strtolower($message), 'quit','exit'))
break;
echo "id: $id\n";
echo "data: $message\n";
echo "\n";
} else {
echo "data: $msg_error\n";
echo "\n";
break;
}
ob_end_flush();
flush();
if(connection_aborted())
break;
}
msg_remove_queue ($queue_id);
В общем при вызове 1го скрипта
в клиенте в консоли JS сыпится сразу 3лога.
OPEN, Message, Error.
Причем Message скрипт получает 43. т.е. это сообщение ошибки при неудачном выполнении msg_send.
В 1ом скрипте есть ошибка как Вы заметили, я там 2 раза указал оператор msg_get_queue(). а между ними указал оператор msg_remove_queue();
.
Так вот если я не буду указывать msg_get_queue() и msg_remove_queue() дополнительно.
То клиент вообще не получает сообщений.
А если укажу эти 2 функции то клиент получает сообщение 43 , ошибку и открытие каждый раз при вызове msg_send семафора ,
1. Не понятно что за ошибка семафора 43.
2.Не понятно каким образом msg_remove_queue() очистка семафора влияет на новое открытие потока.
3.Не понятно какой инструмент использовать в браузере чтобы видеть состояние подключения к 3тему скрипту клиентом.
rPman, не умею их использовать. Но при мыслях с чего же начать, мне попался SSE.
Но даже без семафоров, SSE отлично работает у меня.
.
Но подскажите пожалуйста, когда я НЕ удаляю //msg_remove_queue() метку симафора, то тогда симафор вообще перестает получать сообщения.
Может я в коде чтото не так обозначил и определил?
Советую поиграть с очередями сообщений, на простейших тестовых скриптах (прямо копируй из документации)... основная идея
- есть очередь (с указанным идентификатором), в нее все процессы могут отправлять и могут читать сообщения, после чтения сообщения, оно удаляется из очереди, очередь FIFO.
- можно читать сообщения определенного типа (второй параметр msg_receive) пропуская остальные (поведение по умолчанию)
- очередь живет даже если все процессы, использующие ее, закрылись (т.е. можно положить сообщение, закрыть процесс, потом открыть и прочитать его, есть лимиты), чтобы убить очередь, ее нужно msg_remove_queue но любой процесс, попытавшись ее прочитать, создаст ее пустую в момент вызова msg_get_queue (т.е. сообщения в очереди будут лежать до выключения компьютера, учитывай это)
- можно не ждать сообщения в очередь (флаг MSG_IPC_NOWAIT у msg_receive) т.е. определить, есть ли сообщения указанного (или любого, не равного указанному, MSG_EXCEPT флаг) в очереди.
Семафоры хороши, если тебе надо сообщать что то, не ожидая ответа, и хотя ответы можно симулировать через тип сообщений, используя его как идентификатор процесса, но лучше так не делать, размер очереди маленький, для двунаправленных сообщений лучше сокеты использовать, подняв свой сервер (почему я и говорю, если в проекте есть websocket сервер, его можно использовать и внутри бакэнда).