Nette + database + Json-RPC2 – problem s cachi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
skrivy
Člen | 52
+
0
-

Ahoj,

resim ted zajimavy problem s Nette 2.0.10 a posledni verzi Json-rcp2.

Pri requestu pres json-rpc2, ktery pouziva databazi se mi stale vraci chyba:

object(stdClass)#150 (3) {
  ["jsonrpc"]=>
  string(3) "2.0"
  ["error"]=>
  object(stdClass)#145 (2) {
    ["code"]=>
    int(0)
    ["message"]=>
    string(284) "ErrorException: fopen(/var/www/web5/temp/cache/_Nette.Database.4c28907f740a43b60302e51f43258fda/_07414f4e15ca943e6cde032dec85d92f): failed to open stream: No such file or directory
in file /var/www/web5/libs/Nette/Caching/Storages/FileStorage.php
on line 159"
  }
  ["id"]=>
  NULL
}

Vygenerovany Nette.Configurator v tempu.

protected function createServiceNette__database__default()
{
  $service = new Nette\Database\Connection('mysql:host=;dbname=', '', '', NULL);
//  $service->setCacheStorage($this->getService('cacheStorage'));
  Nette\Diagnostics\Debugger::$blueScreen->addPanel('Nette\\Database\\Diagnostics\\ConnectionPanel::renderException');
//  $service->setDatabaseReflection(new Nette\Database\Reflection\DiscoveredReflection($this->getService('cacheStorage')));
  $service->onQuery[] = array(
    $this->getService('nette.database.defaultConnectionPanel'),
    'logQuery',
  );
  $service->setCacheStorage(new Nette\Caching\Storages\DevNullStorage);
  $service->setDatabaseReflection(new Nette\Database\Reflection\DiscoveredReflection(new Nette\Caching\Storages\DevNullStorage));
  return $service;
}

Pokud ty 2 radky zakomentuju, tak vse slape, jak ma. Jenze, config generator je generuje odkomentovane :\

Obsah config.ini:

common:
	parameters:
		database:
			driver: mysql
			host:
			dbname:
			user:
			password:

	php:
		date.timezone: Europe/Prague

	nette:
		session:
			expiration: '+ 14 days'

		database:
			default:
				dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%

	services:
		nette.database.default:
			setup:
				- setCacheStorage( Nette\Caching\Storages\DevNullStorage() )
				- setDatabaseReflection(Nette\Database\Reflection\DiscoveredReflection( Nette\Caching\Storages\DevNullStorage() ))

Diky za nakopnuti.

SparkCZ
Člen | 22
+
0
-

Stává se mi to taky, při použití json-rpc2 doplňku se nevytvoří cache konfigurace databáze, pouze se uloži v jakém by měla být souboru. Zkus nejdřív všechna připojení do db „nacachovat“ ručně někde mimo (zavolej si jeden dotaz do každé tabulky přímo v presenteru mimo json-rpc), pak to bude fungovat. Musíš to opakovat po každém vymazání cache. Zatím jsem nějak nehledal čím to je, takže možná nikdo jiný poradí lepší řešení.

Bedna
Člen | 7
+
0
-

Přišel někdo na něco? Mě to teď také zaseklo, ale nechci se zbavovat kompletně cache databáze, jen tedy pro server… Tak jsem dal do RPC presenetru toto a funguje to.

<?php
    public function startup()
    {
        parent::startup();

        $database_service = $this->context->getService("nette.database.default");
        if ($database_service)
        {
            $database_service->setCacheStorage(new \Nette\Caching\Storages\DevNullStorage());
        }
    }
?>

Zkusím ještě popřemýšlet, proč dochází k této chybě.

Editoval Bedna (16. 3. 2014 19:56)

Bedna
Člen | 7
+
0
-

Tak jsem řešil další problém a to, že serveru vadí každý notice (což v MPDF a podobných knihovnách není v mých silách opravit). Zkoumal jsem, až jsem došel k tomu, že tam je vlastní error handler. Upravil jsem takto:

<?php

    $handler = set_error_handler(array($this, '_errorHandler'), E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);

?>

Možná by to vyřešilo i ten problém s cache, tak to kdyžtak zksute, já na to už nemám čas a ani nervy :-D