2012-11-24 2 views
6

Mam skrypt PHP "A", który uruchamia kolejny skrypt PHP "B", który trwa do 5 godzin. Używam do tego funkcji zwijania. Ale moim problemem jest to, że skrypt "A" nie ma pewności, czy połączenie ze skryptem "B". Zmieniłem max_execution_time, timeout, socket-timeout, etc ... ale nic nie pomaga.Problemy z utrzymaniem połączenia w sieci

Czy muszę wysłać nagłówek do skryptu "B" z zawinięciem czy coś?

$curl_header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text 
/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$curl_header[] = "Cache-Control: max-age=0"; 
$curl_header[] = "Connection: keep-alive"; 
$curl_header[] = "Keep-Alive: 84600"; 

$url = 'http://test.de/test_B.php'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $curl_header); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); 
curl_setopt($ch, CURLOPT_TIMEOUT, 84600); 
curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
$curl_errno = curl_errno($ch); 
curl_close($ch); 

`

+1

wkleić kod? – GBD

+0

Czy wywoływanie skryptu php samo się kończy? Czy umieściłeś max_execution time na wywołującym sciptie na 0? Czy masz ustawiony niski współczynnik transferu - jeśli otrzymasz odpowiedź częściową (łącznie z białymi znakami), a następnie nic, CURLOPT_LOW_SPEED_TIME może zacząć? – Robbie

Odpowiedz

1

Jeśli skrypt„B”zajmuje dużo czasu, aby zakończyć to może być przydatne, aby umieścić w czasie wykonywania niektórych echo "something"; flush(); że mantain połączenie żywy.

Zdarza mi się ostatnio przy podobnym wykonaniu.

0

Skrypt B przechowuj gdzieś swoje wyjście, a następnie po 5 godzinach połącz i sprawdź. Serwery HTTP nie są zaprojektowane na te czasy i możesz ponieść wszelkie limity czasu.

0

Można użyć następujące architektury:

Script wywołuje skrypt, który uruchamia skrypt B C poprzez żądanie powłoki w tle i zwraca jakąś identyfikatorem. Zasadniczo skrypt B rozpoczyna 5-godzinną pracę, która działa w tle i nie trzeba utrzymywać połączenia. Możesz zapisać postęp w bazie danych lub pliku.

Następnie skrypt A może wywoływać postępy w 5-godzinnym skrypcie C, wywołując interfejs echa, nazwijmy go Skryptem D, który odczyta bazę danych lub plik i prześledzi, jak daleko zajdzie skrypt C z jego zadaniami.