2012-04-22 21 views
8

Mam wywołanie ajax do somefile.php. Chcę, aby skrypt php wykonał proste zadanie, a następnie odesłał dane do użytkownika i tylko wykonał bardzo czasochłonne zadania. więc muszę opróżnić wyjście po pierwszym prostym zadaniu. to nie działa, prawdopodobnie dlatego, że mam włączone gzip.Dla php flush - jak wyłączyć gzip dla określonego pliku?

Zdecydowanie nie chcę wyłączać programu gzip we wszystkich plikach vhost, a także nie we wszystkich folderach, w których znajduje się plik somefile.php. po prostu chcę wyłączyć to dla tego konkretnego pliku. czy to jest możliwe?

EDIT:

to co podaję w moim apache conf:

<FilesMatch \.php$> 
    SetEnv no-gzip 1 
</FilesMatch> 

to mój skrypt php:

<?php 
$sucesss = @apache_setenv('no-gzip', 1); 
@ini_set('zlib.output_compression', 0); 
@ini_set('implicit_flush', 1); 

ob_start(); 

for($i=0;$i<10;$i++) 
{ 
    echo 'printing...'; 
    ob_flush(); 
    flush(); 

    sleep(1); 
} 
?> 

to nie działa. nadal widzę wszystkie wyniki razem po 10 sekundach.

+1

Jeśli Twój serwer sieciowy obsługuje kompresję gzip, myślę, że nie można go wyłączyć przez PHP. – noli

+0

Może spojrzeć na to: http://stackoverflow.com/questions/1922934/how-to-disable-mod-deflate-in-apache2 – noli

Odpowiedz

1

umieścić to w httpd.conf

# exclude certain page requests (e.g. for requesting getMyFile.php?action=getFile&id=3 as non-compressed) 
SetEnvIfNoCase Request_URI getMyFile\.php$ no-gzip dont-vary 
+0

Jak można wyłączyć to tylko dla niektórych żądań do tego samego pliku? np .: 'ajax.php? a = lista & id = 5' -> z kompresją ' ajax.php? a = pobierz & file = image.png' -> bez kompresji –

+0

@ B.Martin Pozostaw '$' off z regex i dołącz parametr żądania. Jak 'ajax \ .php \? A = pobieranie'. – Chloe

6

ja szukałem rozwiązań dla tej samej kwestii. To właśnie dla mnie zadziałało, ale niestety nie jest to nagłówek VALID.

<? 
header("Content-Encoding: none"); 
?> 
+0

Oto specyfikacja 'Content-Encoding': https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5 – Chloe

1

apache_setenv() jest poprawna. Zobacz dokumentację.

http://php.net/manual/en/function.apache-setenv.php#60530

apache_setenv('no-gzip', '1'); 

Twoim problemem jest to, że włączone buforowanie wyjścia z ob_start(). Skomentuj to.

Dowiedziałem się, że apache_setenv() jest dostępny tylko z modułem PHP Apache. Nie jest dostępny podczas używania FPM. W takim przypadku, aby wyłączyć GZip, musisz użyć .htaccess. Przykładem jest

https://stackoverflow.com/a/36212238/148844

RewriteRule ^dashboard/index - [E=no-gzip:1] 
SetEnvIf REDIRECT_no-gzip 1 no-gzip 

The - oznacza Noop, E oznacza ustawienie zmiennej 1 jest wartością. Po przekierowaniach zmieniono nazwy zmiennych i dodano je przed numerem REDIRECT_.

Jeśli dane wyjściowe nadal są buforowane, sprawdź, czy korzystasz z proxy lub pamięci podręcznej. Sprawdź, czy są obecne nagłówki, takie jak Via: 1.1 varnish lub Via: 1.1 vegur. Będą również buforować odpowiedź.

Powiązane problemy