Prevenzione di un timeout del gateway 504 con un enorme script PHP

Attualmente sto usando un server Apache (2.2) sul mio computer locale (Windows) che sto usando per eseguire alcuni script PHP per occuparmi di un lavoro noioso. Uno degli script include un sacco di spostamento, ridimensionamento e download / caricamento di file su un altro server. Mi piacerebbe molto che la sceneggiatura continuasse a funzionare in modo tale da non wherer ridare vita allo script avviandolo di nuovo each volta che scade.

set_time_limit(0); ignore_user_abort(1); 

Entrambi sono impostati nel mio script, ma dopo circa 30 minuti a un'ora lo script si interrompe e ricevo il messaggio 504 Gateway Time-out nel mio browser. C'è qualcosa che mi manca in Apache o in PHP per prevenire il timeout? O dovrei eseguire lo script in un modo diverso?

O dovrei eseguire lo script in un modo diverso?

Decisamente. Dovresti eseguire il tuo script dalla row di command ( CLI )

se wheressi implementare qualcosa del genere, ti farei 2 diversi script:

  • A. process_controller.php
  • B. process.php

Il stream di lavoro dovrebbe essere:

  1. l'utente chiama lo script A utilizzando un browser
  2. lo script A avvia lo script B utilizzando un sistema () o exec () e passa ad esso un "token di process" tramite la row di command.
  3. lo script B scrive lo stato di esecuzione in uno spazio condiviso: un file chiamato come token, una tabella di database. in generale qualcosa che può essere letto anche dallo script A usando il token come riferimento
  4. lo script A contiene una chiamata AJAX, nel polling, che richiede allo script A lo stato del process per un determinato token

Sondaggio Ajax:

 <script> var $myToken; function ajaxPolling() { $.get('process_controller.php?action=getStatus&token='+$myToken, function(data) { $('.result').html(data); }); } setInterval("ajaxPolling()",60*1000); //Every minute </script> 

ci sono alcune considerazioni sulla comunicazione tra i 2 processi, a seconda di quante istanze dello script B si sarebbero potute eseguire in parallelo

  1. Solo uno: non è necessario un token random / univoco
  2. Uno per utente: session_start(); $token = session_id(); session_start(); $token = session_id();
  3. Più di uno per utente: session_start (); $ token = session_id (). microtime ();

Se devi eseguirlo dal tuo browser, assicurati che non ci sia il limite di php nell'esecuzione nel file php.ini, ma anche che non ci sia un limite impostato in mod_php (o che cosa stai usando) sotto apache.

Usa php's system() per call uno script di shell che avvia un'attività di servizio / background.