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?
Parece que você está redefinindo sua variável de sessão para "indefinido" toda vez que chama o arquivo, independentemente de ser uma solicitação "triggerLoop" ou "listen".
Provavelmente você só precisa mover a variável reset para dentro da condicional triggerLoop:
Observe que você ainda tem uma condição de corrida aqui, já que está fazendo isso
setInterval
em JS e tambémsleep(1)
em PHP, então não espere necessariamente obter 5 números aleatórios (você pode obter apenas os primeiros 3-4 números diferentes e, em seguida, o mesmo número repetidamente). Parece que você está apenas testando a funcionalidade, então provavelmente não é um problema no seu caso de uso real, mas é algo a se considerar.Deixa pra lá, já consertei. Percebi que é a mesma sessão, mas o problema era com o bloqueio de sessão. Tive que iniciar a sessão, alterar a variável e então fechar a sessão.