Autor Zpráva
Keeehi
Profil
Ahoj,
potřeboval bych zařídit, aby po tom, co uživateli vypíše nějaké informace s ním komunikaci ukončil avšak nadále si vykonával nějakou činnost.
Dle těch různých návodů a kousků scriptů, co se válí po internetu jsem vytvořil následující kód. A ač by podle mě měl fungovat, tak nefunguje podle očekávání.

<?php
header("Content-Type: text/plain; charset=utf-8");
ignore_user_abort (true);
ob_start();
 
echo "Vypsat\n";
 
header("Content-Length: ".ob_get_length());
header("Connection: close");

ob_end_flush();ob_flush();flush();

sleep(5);

echo "Nevypisovat"; //stejně se to do prohlížeče dostane

Jediné, co mě ještě napadá je, že to možná nějak souvisí s konfigurací apache, který drží spojení aktivní dokud script pracuje. Nevím ale co bych měl hledat.


Díky za každé popostrčení správným směrem.
Joker
Profil
Keeehi:
potřeboval bych zařídit, aby po tom, co uživateli vypíše nějaké informace s ním komunikaci ukončil avšak nadále si vykonával nějakou činnost.
Tak mu už nic neposílejte.
Keeehi
Profil
Joker:
Nejde moc o to, zda se tam něco vypíše nebo ne. Jde hlavně o to, že to spojení zůstává aktivní. Problém je, že tento script je volán jinou externí službou a tam vyprší timeout z čehož není zrovna nadšená. Tudíž bych potřeboval na začátku vypsat, že jsem požadavek přijal a ukončit s ní spojení. A pak si hrát na už jen na svém písečku.
Virtus
Profil
Zdravím,

bez exec(); to asi rozumně nepůjde, nebo teda já řešení neznám, takže tady jeden odkaz: http://stackoverflow.com/questions/3819398/php-exec-command-or-similar-to-not-wait-for-result a stručně řečeno, to pracuje tak, že ve scriptu, který vypisuje data zavoláš daný exec() command který spustí jiný script.
Keeehi
Profil
To už mě napadlo, ale nechávám to jako poslední řešení. Zdá se, že jiným řešení čistě pomocí php funguje. Čekám, že to bude konfigurací někde něčeho, jen nevím čeho.
DarkMeni
Profil
Zkoušel si prohodit header pro Connection a Content-Length? Ne, neprohazuj je, prej je to tak dobře
<?php
// buffer all upcoming output
ob_start();
echo "Here's my awesome web page";
 
// 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();
 
/******** background process starts here ********/

sleep(5);
echo "Nějakej další výstup?";
$file = fopen("test.txt", "w");
fwrite($file, "Čau, tohle je testovací soubor");
fclose($file);
?>

Kdyžtak tohle řešení je na https://www.zulius.com/how-to/close-browser-connection-continue-execution/ a na localhostu ve firefoxu mi to funguje
Keeehi
Profil
DarkMeni:
I toto už jsem zkoušel a nefungovalo mi to.

Ale konečně jsem se dobral k výsledku. Většinu z následujících informací nemám podloženou testy, ale myslím, že jde o rozumné doměnky.
Tou službou, o kterou se jednalo byl github. Jak jsem později zjistil, tak ačkoli prohlížečům řešení z [#6] nestačilo, jemu ano. Pravděpodobně by mu stačilo i to z [#1] a možná i něco méně, nemám však náladu to teď testovat. Tím se mi problém celkem vyřešil, protože timeout u prohlížečů mě nezajímal. Přesto mi to nedalo a hledal jsem dál. Po dlouhém pátrání jsem někde naspod stackoverflow našel zmínku o fastcgi_finish_request(). Vyzkoušel jsem ji a už to funguje všude. Takže se domnívám, že řešení tohoto problému záleží právě na konfiguraci webového servru. Někde stačí flush, nekde je zapotřebí fastcgi_finish_request.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: