Я экспериментирую с веб-сокетами и хотел бы определить, не перешел ли пользователь со страницы на запуск сценария PHP-потока. Все остальное работает нормально.
Все, что я пытаюсь сделать, не останавливает выполнение PHP-скрипта (используя Xampp локально).
В настоящее время я работаю с JavaScript beforeunload
и PHP connection_aborted()
, connection_status()
и даже file_exists()
(который является единственным, который работает в настоящее время !!!).
Пока сценарий не существует или я перезагружаю apache, я не могу перезагрузить страницу, но мне нужно начать работу с обнаружением прерывания. Firebug сообщает, что скрипт сокета был прерван, но PHP просто продолжает работать. Любая помощь приветствуется.
Мой JavaScript выглядит так
function socket_open(){
if(!!window.EventSource){
var websocket = new EventSource('./ajax/progress.php');
websocket.addEventListener('message', function(e){
var data = JSON.parse(e.data);
console.log(data);
},false);
$(window).bind('beforeunload', function(){
websocket.onclose = function(){};
websocket.close();
});
}
}
И мой PHP такой.
./ajax/progress.php
function get_task_progress(){
$output = array();
//conditionally create some output
if(!empty($output)){
echo 'data: '.json_encode($output)."\n\n";
ob_flush();
flush();
}
sleep(1);
if(!connection_aborted() && connection_status()==0 && file_exists('1.txt')){
get_task_progress();
}
}
Я, кажется, решил, но повторяет и сбрасывает состояние отсутствия обновлений при каждом запросе перед проверкой живого соединения
if(!empty($output)){
$tasks_state = $tasks_new;
echo 'data: '.json_encode($output)."\n\n";
}else{
echo 'data: '.json_encode(array('e'=>0))."\n\n";
}
ob_flush();
flush();
sleep(1);
if(!connection_aborted() && connection_status()==0){
get_task_progress();
}
Других решений пока нет …