Obsluha requestu a blokování dalších requestů
- malkol
- Člen | 133
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 | 1260
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 | 1260
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
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
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
- Marek Bartoš
- Nette Blogger | 1260
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