Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

174
Visualizações
El script Php se invoca automáticamente varias veces

Estoy enfrentando un problema extraño aquí. Estoy usando javascript ajax (usé jquery). Ahora el escenario es;

Una llamada ajax está invocando un script php que es básicamente un proceso de ejecución prolongada y establece algunas variables de sesión.

Más tarde, en algunos intervalos (digamos en cada 2 segundos), estoy ejecutando otras llamadas ajax para verificar las variables de la sesión y saber cuándo se completa el proceso (primera ejecución del script php).

El primer script php está obteniendo datos de la base de datos y los convierte en un archivo. En cada recuperación, cuento el número de bucle y lo almaceno en una variable de sesión para mantener algún tipo de registro de seguimiento. Me gusta;

 $i=0; $_SESSION['time']=date('mdY H:i:s'); while(...) { ini_set('session.use_only_cookies', false); ini_set('session.use_cookies', false); ini_set('session.use_trans_sid', false); ini_set('session.cache_limiter', null); session_start(); $_SESSION['tracksatus']="loop number : ".$i." time is :"$_SESSION['time']; session_write_close(); $i++; ...... ...... }

Otro script php que estoy invocando a través setInterval ajax está haciendo algo así;

 echo $_SESSION['trackstatus']

El intervalo establecido ajax me está devolviendo como;

 loop number 1 time is mdY H:i:s loop number 5 time is mdY H:i:s loop number 8 time is mdY H:i:s ......

Luego, después de unos pocos, vuelve a llamar;

 loop number 1 time is mdY H1:i1:s1 .....

Observe el cambio de H:i:s a H1:i1:s1

Entonces, según tengo entendido, el script php se invoca dos veces. Y para su información, el mismo código estaba funcionando justo antes de las 12 horas. Y me enfrenté a este problema antes y de alguna manera lo resolví (ensayo y error, así que no sé cómo o puede ser automáticamente... bueno, en realidad no tengo ni idea).

¿Puede por favor darme una idea de lo que estoy haciendo mal? Por favor mencione si necesita más información.

Y lo gracioso es que está funcionando como se esperaba justo después de hacer esta pregunta sin siquiera cambiar una sola línea de código. Pero quiero saber el motivo.

about 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Creo que sé cuál es el motivo, PHP escribe variables de sesión en el archivo, pero lo hace solo al final de la ejecución del script, por lo que no puede ver los cambios de sesión en otro script antes del final de uno largo.

Puede solucionarlo agregando session_write_close(); session_start(); después de cada cambio de datos de sesión.

session_write_close escribirá los cambios en HD, para que otro script pueda leerlos. session_start cargará la sesión desde HD, pero asegúrese de que su otra secuencia de comandos no realice cambios para una sesión, estos cambios serán sobrescritos por su secuencia de comandos larga.

Y una cosa más si está utilizando dominios separados: antes de que ocurra la llamada AJAX real, su navegador envía una solicitud de OPTIONS a la misma URL para verificar los encabezados CORS. Entonces, al comienzo de su secuencia de comandos, verifique el HTTP METHOD y, si es HEAD u OPTIONS , haga die();

about 4 years ago · Santiago Trujillo Relatório

0

En lugar de usar sesiones, intente usar un archivo temporal para llevar la cuenta con una identificación dinámica

JavaScript

 var time = Date.now(); $.get('/firstURL?time='+time); setInterval(function(){ $.get('/secondURL?time='+time, function(response){ console.log(response); } }, 1000);

Primera URL de PHP

 <?php $id = $_GET['time']; $count = 0; while(...) { // Do your stuff $count++; file_put_contents("/tmp/{$id}", $count); } ?>

Segunda URL de PHP

 <?php $id = $_GET['time']; $count = 0; try { $count = file_get_contents("/tmp/{$id}"); } catch(Exception $e) {} echo $count; ?>
about 4 years ago · Santiago Trujillo Relatório

0

Como han dicho otros, PHP no escribe la sesión hasta que finaliza la ejecución. es mejor que cree una función php a la que llame que escriba un archivo con el progreso y luego su segunda llamada ajax solo lea el archivo.

 function updateCreateProgress($jobStartTime, $progress){ file_put_contents('/tmp/'.$jobStartTime.'.txt', $progress); } function completeProgress($jobStartTime){ unlink('/tmp/'.$jobStartTime.'.txt') }

ahora su segundo script puede buscar '/tmp/'.$jobStartTime.'.txt' si está allí, léalo usando file_get_contents si no está allí, informe que ha terminado.

about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda