Obsluha requestu a blokování dalších requestů

malkol
Člen | 133
+
0
-

Dobrý den,

V případě, že obsluhou requestu je stažení souboru.

 $response = new FileResponse($filepath);
 $this->presenter->sendResponse($response);

A v případě, že soubor je veliký, nebo trvá stažení, kvuli rychlosti připojení, nette neobslouží další requesty ze stejné (session?,browser?)

Projeví se to uplným zmrznutím aplikace.
Pokud během toho, otevřu další prohlížeč nebo to celé dělám v anonymním režimu, nette obsluhuje jeden request za druhým bez problému.

Čím je to způsobeno? Dělám něco špatně? Dá se to chování nějak konfigurovat?

Díky

Marek Bartoš
Nette Blogger | 1173
+
+1
-

Je to tím, že session je blokující. Dokud se neuvolní zámek, tak další request čeká. Řešením je session zavřít přes $this->session->close();
Případně si nastavit asynchronní handler, pokud je aplikace napsaná tak, aby si requesty nepřepisovaly data v session.

Marek Bartoš
Nette Blogger | 1173
+
+2
-

Specificky u souborů též můžeš zpracování delegovat na webserver. Pošleš speciální hlavičku říkající webserveru, odkud soubor vzít a odeslat response. Nebudeš tak zatěžovat php. Je o tom hezký článek na blogu https://blog.nette.org/…ovedi-cast-2

malkol
Člen | 133
+
0
-

Jasný, rozumím. V podstatě řeším to, co popisuje ten blog s velkými fily.
Ale nějak úplně nepomohlo

$this->session->close();

nebo to dělám špatně.
Stačí to provolat v té acction před/po sendResponse?

Ohledně asynchroního handleru se mi nepodařilo nic dohledat mohu poprosit o nějaký zdroj?. Pokud action pouze servíruje nějaký file, asi by ani nebyl prostor pro to něco špatně asynchroně přepsat ne?

PS: Zatím bych se držel v nette, záloha je samozřejmě použít webserver a mod_xsendfile.

malkol
Člen | 133
+
+2
-

Ještě doplňuji jeden názor z SE:

After all, mod_xsendfile:
is not a standard Apache module officially supported.
needs to be compiled separately; not in any repository.
was originally designed for Apache 2 & 2.2.
hasn't been maintained since 2011

https://serverfault.com/…e-deprecated

Marek Bartoš
Nette Blogger | 1173
+
0
-

Zavřít session by mělo stačit před odesláním response. Možná tě tedy blokuje ještě něco jiného.

Ohledně asynchroního handleru se mi nepodařilo nic dohledat mohu poprosit o nějaký zdroj?

Jde o to změnit session.save_handler z výchozího na nějaký, který nepoužívá zámky. To už si určuje implementace sama, takže je třeba si to zkontrolovat u konkrétní implementace. Kupříkladu phpredis ve výchozím stavu funguje bez zámků a requesty tak neblokuje https://github.com/…dis/phpredis#…

To o mod_xsendfile jsem netušil. Už nějakou dobu používám místo Apache Nginx, který má obdobnou feature přes hlavičky X-Accel