2016-11-20 5 views
1

Итак, у меня есть файл PHP, который будет случайно получать новые опубликованные данные от сторонних разработчиков. Для простоты, давайте назовем его get_data.php и сказать, что это выглядит примерно так:Передача данных из PHP-скрипта в PHP Event Stream

<?php 
$data = $_REQUEST; 
// Data processing 

А то у меня есть отдельный скрипт, stream.php, который использует HTML5 Server-Sent Events для потоковой передачи данных клиента (JS):

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

while (true) { 
    echo 'data: ' . $data . PHP_EOL; 
    echo PHP_EOL; 
    ob_flush(); 
    flush(); 
    sleep(1); 
} 

Каждый сценарий сам по себе работает нормально. Однако мне нужно передать $data от первого сценария ко второму.

Я знаю, что могу добиться этого, сохранив переменную в DB или временном файле, но в идеале я смог бы сделать это с помощью только PHP.

В том числе один файл внутри другого не похож на хороший вариант либо потому, что заголовки потока, скорее всего, испортят сообщения сторонних поставщиков данных, и я хотел бы сохранить обработку данных отдельно от поток в случае сбоя последнего.

ПРИМЕЧАНИЕ - Это не дубликат других вопросов о том, как передавать данные между PHP скрипты на веб-странице, учитывая, что я, казалось бы, не может использовать $_SESSION переменные данные, размещенные третьей стороной, отличной от пользователя доступ к потоку событий.

+1

Вы должны хранить его где-нибудь. Для чего-то подобного вам нужна система обмена сообщениями. Посмотрите на Redis pubsub, RabbitMQ или ZeroMQ в качестве отправной точки. – bcmcfc

ответ

1

Вы можете использовать общую память для передачи данных между отдельными сценариями. http://php.net/manual/en/intro.sem.php

Для этого потребуется, чтобы оба сценария выполнялись на одном физическом компьютере/vm, и вам нужно будет определить способ идентификации разделов разделяемой памяти для какой сессии.

Вы можете объединить это с очередями системных сообщений, чтобы сигнализировать, когда (и, возможно, где) появились новые данные. Хотя будьте осторожны, так как они реализуются с различными ограничениями на системах Linux/BSD/Unix (MacOS имеет некоторые раздражающие ограничения, которые Linux не делает)

НТН

+0

Черт, это хитроумный трюк .. Я, вероятно, в конечном итоге храню данные в БД или что-то вроде того, что это лучший вариант для внедрения atm для нас. Тем не менее, хорошо знать, что _really_ - это путь - хотя и довольно сложный - заставить его работать эффективно, поэтому я принимаю ваш ответ. Для всех, кого это интересует, [это] (https://secure.php.net/manual/en/shmop.examples-basic.php) выглядит как хороший пример. Благодаря, –