Peço desculpas se isso parece uma pergunta repetida, mas agora estou com uma dúvida diferente.
Basicamente, tenho um arquivo PHP configurado assim:
<?php
session_start();
$_SESSION['globalVar'] = "undefined";
if (!empty($_POST['triggerLoop'])) {
for ($x = 0; $x < 5; $x++) {
$_SESSION['globalVar'] = getResult();
sleep(1);
}
}
//------------------------------------------------------
//Listen
if (!empty($_POST['listen'])) {
echo $_SESSION['globalVar'];
}
function getResult()
{
return rand(10, 100);
}
?>
Bem direto. Ele deve atualizar uma variável global (globalVar) de dentro de um loop a cada 1 segundo, usando um int aleatório.
Tenho um arquivo script.js que cria XmlHttpRequests separados para este arquivo PHP. A primeira requisição acionará o loop (que atualiza a variável global).
Imediatamente depois disso, o script.js iniciará um intervalo em que começará a enviar novos XHRs para o arquivo php a cada segundo e tentará ler o valor de globalVar.
function postToHandler(){
console.log("Posting to handler");
let xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open("POST", "./apps/researcher.php");
let form = new FormData();
form.append('triggerLoop', "mockData");
xhr.send(form);
activateGlobalsListener();
}
function activateGlobalsListener(){
setInterval(function(){
let xhr_listen = new XMLHttpRequest();
xhr_listen.withCredentials = true;
xhr_listen.open("POST", "./apps/researcher.php");
let form = new FormData();
form.append('listen', "mockData");
xhr_listen.send(form);
xhr_listen.onreadystatechange = function (){
if(xhr_listen.readyState === XMLHttpRequest.DONE){
console.log("RECEIVED LISTEN DATA");
console.log(xhr_listen.response);
}
}
},1000);
}
Eu esperava que os XHRs no setInterval retornassem ints aleatórios, mas eles sempre retornam "indefinido".
O que me faz pensar se isso acontece porque os XHRs estão criando suas próprias sessões exclusivas? Por exemplo, o primeiro XHR cria a sessão nº 1. E então os XHRs subsequentes criam a sessão nº 2... a sessão nº 3... etc. E é por isso que esses XHRs subsequentes não conseguem acessar as variáveis globais da sessão nº 1? Porque elas existem em sessões diferentes?