Podivné chování @inject na produkčním serveru – OPRAVA

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

POZOR!!!
Dole píšu že to nefunguje přes konstruktor Kdyz pridam do DefaultPresenter.php konstruktor:

	public function __construct(\Models\Products $productsModel)
	{
		parent::__construct();

		$this->productsModel = $productsModel;
	}

Tak to funguje. Ale musim u pravit

	/**
	 * @inject
	 * @var \Models\Products
	 */
	public $productsModel;

na

	/**
	 * @var \Models\Products
	 */
	public $productsModel;

Takze v presenteru nefunguje nejak anotace @inject.


PŮVODNÍ DOTAZ

Narazil jsem na podivné chování @inject. Na localhost to funguje úplně bez problému, ale po nahrání na hosting WEDOS to nefunguje vůbec a nebo částečně. Tím částečně myslím to že po prvé se aplikace provede a pak server vrací 500. Používám poslední verzi 2.1 minifikovanou (phar). Nebudu zde vypisovat kompletní kody. Pouze jejich casti:

config.neon

services:
	productsModel: \Models\Products

ProductsModels.php

<?php

namespace Models;

final class Products extends \Models\BaseModel
{
	public function nejakaMetoda()
	{
		......
	}
}

DefaultPresenter.php

	class DefaultPresenter extends \BasePresenter
{
	/**
	 * @inject
	 * @var \Models\Products
	 */
	public $productsModel;

	public function renderDefault()
	{
		$this->productsModel->nejakaMetoda();
	}

Třídy BaseModel a BasePresenter jsou abstraktní a dědí od \Nette\Object(BaseModel) a \Nette\Application\UI\Presenter (BasePresenter).

Tak, výše zmíněné kódy se na localhost provedou vždy. Ale po přesunu na WEDOS se provedou jednou, a pak dlouho server vrací 500. A v logu je „Call to a member function nejakaFunkce() on a non-object“.

Zkoušel jsem přidat ProductModel přes konstruktor a pořad to same.

Editoval webdata (2. 1. 2014 17:47)

David Grudl
Nette Core | 8173
+
0
-

Je na serveru eaccelerator?

webdata
Člen | 153
+
0
-

David Grudl napsal(a):

Je na serveru eaccelerat

Aha tak už jsem možná doma.

Je tam http://awesomescreenshot.com/05f25oyq97

Takže moje doměnka:

  • uplně poprve se scrip provede a @inject funguje,
  • zřejmě zustane v nějaké paměťové cache a další další jeho provedení jaksi neudělá @inject,
  • až vyexpiruje ta mem cache, tak to zase na jedno zavolání scriptu bude fungovat,

Ale možná se mejlím…

// Další poznatek
Pokud použíju co jsem používal a vyhodím ten konstruktor co nemá vubec nic dělat v presenteru a nahradim ho:

	public function injectInit(\Models\Products $productsModel)
	{
		parent::__construct();

		$this->productsModel = $productsModel;
	}

… tak to funguje.

Editoval webdata (2. 1. 2014 18:04)

David Grudl
Nette Core | 8173
+
0
-

Tak zrovna @inject by měly fungovat i s eAcceleratorem, jen to bude brzdit výkon. Kvůli čemu je ta 500?

webdata
Člen | 153
+
0
-

VYŘEŠENO!

Na hostingu WEDOS jsem v konfiguraci PHP vypnul eAccelerator a zhruba do 30 minut než se změna projevila na serveru WEDOS, tak vše už funguje bez problému.

To proč mě to fungovalo na localhost (XAMPP 1.8.1), tak je to tím, že na něm nemám instalovaný eAccelerator.

Těžko říct kde je chyba zda v Nette a nebo v eAccelerator. Ale řekl bych že eAccelerator neměl nikdy spatřit světlo světa a když už se tak stalo, tak měl zůstat ve 20 století.

webdata
Člen | 153
+
0
-

David Grudl napsal(a):

Tak zrovna @inject by měly fungovat i s eAcceleratorem, jen to bude brzdit výkon. Kvůli čemu je ta 500?

500 je na řádku $this->productsModel->nejakaMetoda();

Chyba v laděnce: Call to a member function nejakaMetoda() on a non-object

Pokud počkám na nějakou expiraci cache „eAcceleratoru“ tak po její expiraci se script provede
a přes @inject strikne instance tridy productsModel. Pokud ovsem F5 refresnu stranku treba za 5 vteřin
tak vypadne 500 a v $this->productsModel je NULL.

Editoval webdata (2. 1. 2014 18:57)

David Grudl
Nette Core | 8173
+
0
-

Mohl bys zkusit ještě eAccelerator zapnout, jestli problém odhalí requirements checker? (ten z Gitu) https://github.com/…ents-Checker

webdata
Člen | 153
+
0
-

Zde je výsledek se zapnutým eAccelerator http://awesomescreenshot.com/06025pc874 a zde s vypnutým http://awesomescreenshot.com/0da25peiab

MartinitCZ
Člen | 580
+
0
-

@**webdata**: Tak to je jasné, máš to tam i napsané ;) Problém je eAccelerator.
Viz #php:

Beware when you try to use the getDocComment() methods with eAccelerator turned on. eAccelerator »optimizes« your code in a way that it removes any comments from your source. So at runtime you're not able to get any comments and therefor getDocComments return false.

Editoval martinit (2. 1. 2014 20:11)

webdata
Člen | 153
+
0
-

No to vím. Takže řešení u WEDOSu, je akcelerator vypnout. Mam tam teď na hostingu 5.3 a když to z aktualizuji na 5.4 tak tam je defaultně vyplej.

Quinix
Člen | 108
+
0
-

5.4 u wedosu afaik používá APC opcache, která tenhle problém nemá.

webdata
Člen | 153
+
0
-

Takže děkuji všem co se zapojili do diskuze. Vyřešeno tak že jsem provedl u WEDOS přechod z PHP 5.3 na PHP 5.4 a jede to bez problému. Sice asic zde špatná připomínka ale pro jistotu. Přechod z PHP 5.3 na PHP 5.4 je zdarma a bez ztraty dat. Vše se dá udělat v administraci. Pokud si zřizujete nově hosting u WEDOS, tak už má automaticky PHP 5.4.