PHP + gzip: yakın bağlantısı ve devam yürütme

5 Cevap php

Ben öncelikle Flash istemcisi tarafından kullanılan PHP ile yazılmış bir API backend kısmı, ben sorumluyum. Ne şimdi olur bir: Flash istemcisi, bir çağrı yapar backend gerekli verileri yükler, gerekli işlem ve sonrası işleme, kaydetme ve önbelleğe alma yapar ve sonra müşteriye sonucu döndürür.

Ne ne varsa istiyorum, kısa sürede müşteriye veri döndürmek bağlantısını kapatın ve sonra istemci umurumda zorunda değildir ki bütün şeyler yapmak olduğunu. Bu API, çok daha duyarlı görünüyor yapabilir. Burada önerileri aşağıdaki gibidir:

http://php.net/manual/en/features.connection-handling.php

aslında ben çok pratik değil, hangi çalışması yapmak üzere gzip kodlamasını kapatmak zorunda dışında çalışır. Biz apache mod_deflate kullanın, böylece çalışan bir çözüm ideal olacaktır, ama gerekirse ben de bizim içerik gziplemek için farklı bir yöntem düşünün.

Bu seems Apache "Sana ben göndermek için gidiyorum tüm verileri yolladım" ama ben böyle bir şey bulmak için görünmüyor olabilir bildirmek için bir yol olması gerektiği gibi.

Merak edenler için, evet ben erken sonuçları yıkayın, ancak bağlantı kapanana kadar Flash istemcisi onları işlemez.

5 Cevap

İki sayfaları içine kırarak deneyebilirsiniz.

Ilk sayfasında, gerekli işlem yapılacak, daha sonra) (kıvrılma yoluyla ikinci sayfayı yerleştirin ve ölür.

Bu ilk sayfa tamamlamak için neden ve ikinci sayfa işleme bağımsız, yakın olacaktır.

yani:

Sayfa 1:

<?php

// Do stuff

// Post or get second page...

// Send Data to client

die();
?>

Sayfa 2:

<?php

// Do other stuff....

?>

Bkz http://www.php.net/curl

Eğer bağlantı register_shutdown_function(); için üzeri kayıtlı bir geri çağırma yöntemi içinde kapandıktan sonra yürütmek istediğiniz kod yerleştirerek bunu kesmek bir tür var

Yorum sistem benim kod dışarı bok karıştırıldıysa beri @ Theo.T, ben burada ilanıyla:

Hayır şans. Aşağıdaki yazdırır ekstra bok dışarı ve mod_deflate kullanırken bağlantıyı kapatmak için tam yürütme zaman alır:

function sleepLongTime() { 
    print "you can't see this";
    sleep(30);
}
ob_end_clean();
register_shutdown_function('sleepLongTime');
header("Connection: close\r\n");
ignore_user_abort(true);
ob_start();
echo ('Text user will see');
ob_end_flush();
flush();
ob_end_clean();
die();
set_time_limit(0);
header("Connection: close");
header("Content-Length: " .(strlen($stream)+256));
ignore_user_abort(true);

echo $stream;
echo(str_repeat(' ',256));
@ob_flush();
@flush();
 @ob_end_flush();

your_long_long_long_long_function_here();

Bu kez tüm $stream alınan bağlantısını kapatmak için kullanıcı anlatacağım. şey ama echo için dikkatli olması header bölümü önce u biliyorum: p

Eğer (swf) ikili veri gönderirken eğer kaldırmak gerekir '+256' ve echo(str_repeat(' ',256)); ama bu durumda kod' gönderilen veriler 256 bayttan les ise 'başarısız olabilir olabilir.

Bugün ben de çevresinde bazı testlerden sonra, ben bu şekilde çalışır buldum, bu davayı bir araya geldi:

İki adım:

  1. Emin php script çıkış gzip kodlaması ile değil emin olun, çözüm bu başvurabilirsiniz link:

    <IfModule mod_env.c>
    SetEnvIfNoCase Request_URI "\.php$" no-gzip dont-vary
    </IfModule>

.htaccess prj web sitesine altında dosya üzerinde ekleyin, sonra apache otomatik olarak gziplemek kaçının.

  1. Bazı insanlar features.connection-handling.php dedi, gibi

    set_time_limit(0); 
    ignore_user_abort(true);    
    // buffer all upcoming output - make sure we care about compression: 
    if(!ob_start("ob_gzhandler")) 
        ob_start();         
    echo $stringToOutput;    
    // get the size of the output 
    $size = ob_get_length();    
    // send headers to tell the browser to close the connection    
    header("Content-Length: $size"); 
    header('Connection: close');    
    // flush all output 
    ob_end_flush(); 
    ob_flush(); 
    flush();    
    // close current session 
    if (session_id()) session_write_close(); //close connection
    
    // here, do what you want.