Bir PHP komut dosyası HTTP isteği üzerine bir düşünce içine tarayıcı kandırmak miyim?

5 Cevap php

HTTP isteği bittikten sonra bile ben ilk çalıştırmak için komut dosyası yapılandırmak

 ignore_user_abort(true);

sonra bazı metin yıkayın.

 echo "Thats all folks!";
 flush();

Şimdi nasıl HTTP isteği üzerine bir düşünce içine tarayıcı kandırmak? bu yüzden "sayfa yükleme" gösteren tarayıcı olmadan kendi işimi yapmaya devam edebilirsiniz.

 header(??) // something like this?

5 Cevap

İşte bunu yapmak için nasıl. Bitti kadar çalıştırmaya devam ederken, çıkış ilk N karakterleri okumak ve ardından bağlantıyı kapatmak için tarayıcı söyler.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

Başlıkları çalışmaz (onlar başlıklar konum, bu yüzden first gel)

Bunu yapmanın bazı karanlık bir yolu var sanırım ama ben senaryoyu sonlandırma olmadan http bağlantısını kapatmak için herhangi bir yol bilmiyorum.

Eğer istek yapıldıktan sonra ne yapmak istediğinizi bize anlatıyor bize daha iyi öneriler vermek yardımcı olacaktır.

Ama genelde, ben aşağıdaki hakkında düşünüyor olurdum:

1) benziyor (exec () kullanarak bazı basit komut satırı komut dosyası) çalıştırın:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

Sonra gibi http bağlı komut o başlaması:

<?PHP
exec('/path/to/my/script.sh');
?>

Veya:

2) Başka bir program (muhtemelen sürekli çalışan daemon, ya da bu kadar sık ​​cronned sadece bazı komut dosyası) yazın, ve in-talep kodu o talimatlar geçmek nasıl anlamaya. Sen işi sıralar bir veritabanı tablo var, ya da bir tür düz bir dosya ile çalışması için deneyebilirsiniz. Ayrıca out-of-istek komut dosyası bazı işler kuyruğa neden web tabanlı komut dosyası çağrısı bazı komut satırı komutu olabilir.

Günün sonunda, http isteği sonra yürütme tutmak için want komut dosyası yok. Eğer mod_php'yi kullanıyorsanız varsayarsak, bu komut sonlanana kadar bir Apache sürecini meşgul olacak demektir.

Belki php.net manuel sayfasında bu özel yorum yardımcı olacaktır: http://www.php.net/manual/en/features.connection-handling.php#71172

Teorik olarak, eğer HTTP 1.1 canlı tutma etkin ve istemci sunucu, bu yanıtın sonu olarak tedavi edilmeli ve devam edin ve sayfayı oluşturmak beklediği karakter miktarda aldığı edilir (hala açık bağlantısını tutarken.) (Eğer onlara başka bir yol etkinleştirebilirsiniz olamaz eğer) bu başlıkları göndermeyi deneyin:

Connection: keep-alive
Content-Length: n

n Eğer (çıkış tamponlama bunu saymak yardımcı olabilir.) Cevap gövdesinde gönderdik karakter miktarı nerede ben kendimi bu test için vaktim yok üzgünüm. Ben sadece çalışır durumda öneri atıyorum.

Bunu gerçekleştirmek için en iyi yolu, çıktı tamponlama kullanıyor. Iyi ve hazır olduğunda PHP başlıklarını gönderir, ancak ob_ ile tarayıcınıza çıktı sarın eğer * Eğer başlıklarını yolun her adımını kontrol edebilirsiniz.

İsterseniz tamponunda bir render sayfasını tutmak ve güneş çin çıkageldi kadar başlıklarını gönderebilirsiniz. Bu uygulama açıldıktan <?php etiketleri çok görmek neden olduğunu, ancak hiçbir kapanış etiketleri günümüzde. Bazı dikkate orada içerir olabilir çünkü zamanından önce herhangi bir başlık göndermesini komut dosyası tutar.