Autor | Zpráva | ||
---|---|---|---|
Keeehi Profil |
#1 · Zasláno: 21. 7. 2014, 15:20:56
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 |
#2 · Zasláno: 21. 7. 2014, 17:12:04
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 |
#3 · Zasláno: 21. 7. 2014, 17:22:43
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 |
#5 · Zasláno: 21. 7. 2014, 20:46:57
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 |
<?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 |
#7 · Zasláno: 22. 7. 2014, 03:07:19
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. |
||
Časová prodleva: 10 let
|
0