Podivné chování @inject na produkčním serveru – OPRAVA
- webdata
- Člen | 153
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)
- webdata
- Člen | 153
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
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
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
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
Mohl bys zkusit ještě eAccelerator zapnout, jestli problém odhalí requirements checker? (ten z Gitu) https://github.com/…ents-Checker
- webdata
- Člen | 153
Zde je výsledek se zapnutým eAccelerator http://awesomescreenshot.com/06025pc874 a zde s vypnutým http://awesomescreenshot.com/0da25peiab
- MartinitCZ
- Člen | 580
@**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
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.