Роберто, к сожалению, среда Thrift не имеет такой встроенной функциональности. может быть несколько альтернатив , однако, в зависимости от того, что вы хотите, чтобы ваш клиентский PHP-сеанс выполнял в то время, когда вы обычно ожидали бы ответа от вычислительно-интенсивного сервера Thrift (если бы вы не использовали oneway
).
На данный момент я могу только представить, что вы находитесь в ситуации, когда, закодировав веб-приложение, в котором пользователь (или несколько пользователей параллельно) могут каждый запускать задачу, требующую большого объема вычислений, вы хотели бы предоставить некоторую обратную связь указанным пользователям, в то время как указанные задачи перемешиваются.
С самого начала вы абсолютно правы, пытаясь избежать решения, которого вы пытаетесь избежать. Ваши сеансы PHP-клиента не могут обслуживать интерфейс обратного вызова, не блокируя (если только вы не копаете дыру еще глубже, пытаясь использовать pcntl_fork или какой-либо другой PHP-поток поддержки .)
Самый простой и ИМХО лучший выход из этого - это два переключения с модели, управляемой событиями ( Я хочу получать уведомление, когда сервер завершен ) на модель опроса ( Я буду периодически запрашивать у сервера, выполняется ли это .) Существует несколько способов реализации модели опроса с несколькими вариантами реализации на сервере и на клиенте. стороны, такие как:
во время фазы вызова :
- клиентская сессия PHP выделяет уникальное значение
job_id
; затем сеанс выполняет асинхронный oneway
вызов void compute(..., job_id)
для вычислительного сервера Thrift, требующего больших вычислительных ресурсов,
- или -
- клиентский сеанс PHP делает синхронный вызов
job_id start_compute(...)
для интенсивно вычислительного сервера Thrift; сервер выделяет уникальное значение job_id
, затем порождает актуальную вычислительно-интенсивную задачу в отдельном потоке / процессе, сразу возвращаясь к сеансу клиента PHP с выделенным job_id
на этапе вычисления :
- клиентский сеанс PHP продолжает периодически проверять состояние вычислительно-интенсивного задания через синхронный
status get_status(job_id)
вызов вычислительно-интенсивного Thrift-сервера,
- или -
- клиентский сеанс PHP завершается сразу же, чтобы высвободить ценные ресурсы, после передачи
job_id
браузеру и инструктирования браузера периодически проверять состояние вычислительно-интенсивного задания job_id
(например, через META REFRESH
, или через XHR (AJAX) запрос из Javascript и т. Д.); проверка браузера порождает короткий сеанс PHP-клиента, который выполняет синхронный status get_status(job_id)
вызов вычислительного сервера Thrift с интенсивными вычислениями, который завершается сразу после пересылки состояния (в зависимости от того, что это может быть) в браузер