Databáze – pouze jedno připojení
- woytam
- Člen | 14
V případě souběžného běhu více požadavků probíhá pouze jedno připojení do DB, než je celý požadavek ukončen.
Pro odzkoušení jsem použil aplikaci CD-collection z examples z Nette. Provedl jsem úpravu souboru DashboardPresenter.php
34: public function renderDefault()
35: {
36: $this->template->albums = $this->albums->findAll()->order('artist')->order('title');
++ sleep(20);
37: }
Pokud se pokusím přistoupit na stránku s aplikací (po přihlášení) z prohlížeče (Firefox 17.0.7esr, cache OFF) ve 4 oknech najednou, poslední okno hlásí chybu:
Fatal Error
Maximum execution time of 30 seconds exceeded
File: C:\Vojta\web\nette\DB-test\Nette\Loaders\NetteLoader.php
Line: 101
91: }
92: return self::$instance;
93: }
94:
95:
96: /**
97: * Handles autoloading of classes or interfaces.
98: * @param string
99: * @return void
100: */
101: public function tryLoad($type)
102: {
103: $type = ltrim($type, '\\');
104: if (isset($this->renamed[$type])) {
Problém je v připojení do DB, kdy probíhá pouze jedno
připojení. A celých 20 sekund je blokováno, tudíž poslední
okno se vůbec nespustí než vyprší limit PHP 30 sekund.
Při paralelním připojení více prohlížečů problém není. Vzhledem
k tomu, že skript běží (protože mu vyprší čas) nevidím problém
v prohlížeči.
Tušíte někdo, v čem by mohl být problém? Testováno na localhostu i produkčním serveru.
Nette: 2.0.11
PHP: 5.3.8
- David Matějka
- Moderator | 6445
za to asi nemuze db, ale zamknuty session
Editoval matej21 (23. 7. 2013 22:09)
- David Matějka
- Moderator | 6445
jo, staci nemit ve scriptu sleep(20);
:D
jinak by melo stacit zavolat Nette\Http\Session::close()
(v presenteru $this->session->close()
) a to uzavre session a
odemkne pro dalsi pozadavek