Cannot redeclare class nette\latte\engine in phar
- webdata
- Člen | 153
Takže jsem tu zpět.
Problém s @inject vyřešený. Ale po nějaké době to začalo opět padat a hlásí to chybu:
Fatal error: require(): Cannot redeclare class nette\latte\engine in phar:///data/web/virtuals/46595/virtual/www/domains/nejakadomena.cz/libs/nette/nette.phar/Loaders/NetteLoader.php on line 19
A říkám, že nette\latte\engine je opravdu deklarovaný jednou. index.php, bootstrap.php je stejny jako v sandbox.
PHP verze 5.4.x s Nette verze 2.1 pro jistotu dnes znovu stazená.
Už jsem z toho docela neštastej a nějak si nemužu dovolit sedět pul dne nad nečím co před tim fungovalo.
Editoval webdata (2. 1. 2014 22:53)
- webdata
- Člen | 153
Robyer napsal(a):
Mám stejný problém s minifikovanou phar verzí Nette 2.1.0. A také používám wedos hosting.
Zatím řešení je. Downgrade na verzi 5.3 a vypnout v konfiguraci PHP eAccelerator. Prostě nějak se to nema rádo s těma cache a optocode cache a kdoví s čím ještě.
Ještě nad tím zalaboruju, ale momentálně nestíhám.
Jinak na serveru WEDOS mam minifikovanou verzi. Mozna by to chtelo vyzkoušet normalní verzi ale jak jsem psal nestíham.
- David Grudl
- Nette Core | 8228
Hmmm, „OK, so, as the original author of PHAR, I think I should weigh in on this: First, APC doesn't support PHAR files“ http://www.reddit.com/…ance/c77kmjb
Ale teda sám jsem žádný problém s APC (v3.1.11) a PHAR nezaznamenal.
Včetně nastavení apc.stat=0
.
- David Grudl
- Nette Core | 8228
Ještě mě něco napadlo… můžete vyzkoušet tento PHAR pod 5.4 s APC? https://dl.dropboxusercontent.com/…3/nette.phar
- Milo
- Nette Core | 1283
Tak už na mě vypadla jiná hláška, hledám co za tím je.
Class Nette\Latte\Engine used in service 'nette.latte' has not been found or is not instantiable.
Jinak ten dump APC už posílat nemusíte, našel jsem phpInfo() přímo na Wedos. Také tam píšou, že pro PHP
5.4 můžete změnit apc.enable
. Zkusíte ji vypnout?
- Milo
- Nette Core | 1283
@Jan Tvrdík To ať si posoudí sami.
Hledal jsem chybu asi dvě hodiny a moc moudrý z toho nejsem. Fatal error
se objeví při načítání DI/Container.php
, přesto chybová
hláška mluví o redeklaraci nette\latte\engine
. Nevím, co je na
Container.php tak zvláštního, ostatní soubory v cache jsou, tak třeba
výřez apc_cache_info()
:
[135] => Array
(
[type] => file
[device] => 12
[inode] => 58728
[filename] => phar:///var/www/sandbox-phar/phar/nette-my.phar/Loaders/RobotLoader.php
[num_hits] => 1
[mtime] => 1388777828
[creation_time] => 1388777832
[deletion_time] => 0
[access_time] => 1388777840
[ref_count] => 0
[mem_size] => 61672
)
Na dropbox jsem nahrál různé dumpy.
- fatal.plain je výpis bez laděnky
- xdebug.xt je XDebug tracy se všim možnym
- tryLoad.log je vlastní logování z NetteLoader::tryLog() takhle
public function tryLoad($type)
{
static $c = -1;
$c++;
$log = function($var) use (&$c) {
$msg = str_repeat("\t", $c) . print_r($var, TRUE) . "\n";
file_put_contents('/var/www/sandbox-phar/log/tryLoad.log', $msg, FILE_APPEND | LOCK_EX);
clearstatcache();
return $var;
};
$id = substr(md5(rand()), 0, 4);
$log("ENTER($id)\t$type");
$type = ltrim($type, '\\');
if (isset($this->renamed[$type])) {
class_alias($this->renamed[$type], $type);
trigger_error("Class $type has been renamed to {$this->renamed[$type]}.", E_USER_WARNING);
} elseif (isset($this->list[$type])) {
$log("List ($id)\t" . __DIR__ . '/../' . $this->list[$type] . '.php');
require __DIR__ . '/../' . $this->list[$type] . '.php';
} elseif (substr($type, 0, 6) === 'Nette\\' && is_file($file = __DIR__ . '/../' . strtr(substr($type, 5), '\\', '/') . '.php')) {
$log("File ($id)\t$file");
require $file;
}
$log("EXIT ($id)\n");
$c--;
}
Vypadá to na bug v APC. Jakmile se jednou fatal objeví, nepomůže ani
restart webserveru. Musí se nastavit apc.enable=0
, restart,
refresh stránky. Po nastavení apc.enable=1
chvilku běží, ale
po čase se sporadicky zase objeví. Relevantní PHP bug jsem nenašel.
Nějké nápady?
- webdata
- Člen | 153
Robyer napsal(a):
Nešlo by publikovat 2 různé minifikované verze Nette? Jednu jako .phar a druhou jako klasický .php (jako to bylo dříve)? Pokud je chyba skutečně v APC, tak se jeho opravy člověk asi tak rychle nedočká.
jj, take bych se priklanel ke dvoum verzim minifiokovaneho nette. Ja mel prvne na wedosu problem s @inject. Kdyz jsem vypnul eAccelerator tak to fungovalo. Pak jsem udelal upgrade na PHP 5.4. tak to slapalo ale jenom chvilku. Pak se obevila vyse zminena chyba. Podotykam ze nemam moznost menit na wedos nejak razantne konfikuraci serveru, protoze nemam VPS ale klasiku.
- Milo
- Nette Core | 1283
Podařilo se mi to trochu odizolovat. Jakmile se chyba objeví, její první
výskyt zabije proces Apache s logem zend_mm_heap corrupted
.
Ostatní refreshe i po reloadu Apache už ukazují Fatal error
Cannot redeclare class nette\latte\engine
. Podle strace si APC
před sestřelením něco načte do keše a nelze se pak divit, že
kešuje bludy.
Zabití Apache se dá (někdy) zreprodukovat přidáním
apc_clear_cache()
před load PHARu.
Při nastavení apc.stat=0
se mi tenhle fatal nikdy nepovedlo
zreprodukovat a když už se ukazuje, tak tohle nastavení ho odstraní.
Nenašel jsem PHP bug, který by tuhle situaci popisoval, pouze velmi podobný s opcache. Možná to tedy není bug v APC, ale v PHP samotném.
Bohužel teď nemám čas kompilovat 5.4 snapshot abych bug ověřil a nahlásil PHP bug :(
Nicméně, ještě zkouším najít nějaký workaround…
- David Grudl
- Nette Core | 8228
Tyhle problémy s APC a PHARem jsou docela zklamání (myslím z APC a
PHARu). Nicméně pokud se to dá vyřešit nastavením apc.stat=0
,
tak bych asi zůstal u minifikované PHAR verze. Pokud by to řešit nešlo,
PHAR bych odepsal a vrátil se k původní minifikované verzi. Byť to bude
vyžadovat nějaké reverty v kódu.
- Robyer
- Člen | 74
Co se týče webhostingu u WEDOSu, tak tam takové jemné nastavení
provádět nelze (jen úplně vypnout/zapnout celé APC). A dle toho, co jsem
si přečetl v dokumentaci si nemyslím, že je pro „běžné lidi“ (=
ne-správce serveru) dobrý nápad měnit ten apc.stat
jen jako
workaround kvůli problémovému phar
u.
- Milo
- Nette Core | 1283
Včera a dnes jsem nad tím pár hodin strávil a nejsem schopný to
zreprodukovat na PHP 5.4 snapshotu a s masterem APC extension. Buď je to již
opraveno, nebo mám špatný setup. Ani si nejsem na 100% jistý s
apc.stat=0
.
Pokud to chce zdebugovat někdo jiný, směle do toho. Já už teď do toho více času investovat nechci, protože APC sám pořádně nepoužívám.
S ohledem na ostatní bych se asi vrátil k původní minifikované verzi. Pokud možno i se zachováním PHARu, anebo s přidáním skriptu pro jeho vybuildění do distribuce (jako to má Tracy).
- Milo
- Nette Core | 1283
Na dropbox jsem nahrál minifikovanou verzi Nette 2.1.0. Je vytvořena z:
- větve milo@Nette/v2.1.0-min-milo
- sestavena pomocí milo@build-tools/revert-min
- verze označena
Nette\Framework::VERSION='2.1.0-min-milo'
Je to NEOFICIÁLNĚ vydaná verze a pokud možno, používejte oficiální PHAR. Tato verze může posloužit v případě, že PHAR s APC nefunguje. Někomu funguje, někomu ne.
Nette 2.1.0 testy s ní běží tak snad je OK.
Editoval Milo (8. 1. 2014 22:05)
- Robyer
- Člen | 74
Díky, @Milo. Šlo by to vydat jako composer balíček? Protože některé jiné balíčky, co používám, jsou závislé na Nette a tak se mi stejně nějaká verze Nette nainstaluje… A v tom případě nemůžu jednoduše použít tu tvou z Dropboxu.
Zkoušel jsem i v composeru nastavit přímo tvou větev v2.1.0-min-milo, ale stáhlo to z ní neminifikované Nette.
- Filip Procházka
- Moderator | 4668
@Robyer Můžeš si to inlinovat do projektu pomocí package repozitáře
- Robyer
- Člen | 74
@Filip Procházka Nějak se mi to nedaří.
"repositories": [
{
"type": "package",
"package": {
"name": "nette/nette",
"version": "v2.1.0",
"dist": {
"url": "https://dl.dropboxusercontent.com/s/g4i7ccaob2p3bz7/nette-2.1.0-min-milo.zip?dl=1",
"type": "zip"
}
},
"autoload": {
"files": ["nette-min.php"]
}
}
]
Tohle sice ten balíček stáhne a rozbalí, ale už ho správně
nezaregistruje v composer loader scriptu. Pak to
hlásí: Fatal error: Class 'Nette\Configurator' not found in bootstrap.php
- Milo
- Nette Core | 1283
Pro úplnost celý composer.json
sandboxu:
{
"name": "nette/sandbox",
"description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.",
"homepage": "https://nette.org",
"type": "project",
"license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
"authors": [
{
"name": "David Grudl",
"homepage": "http://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/en/contributors?lang=en"
}
],
"repositories": [
{
"type": "package",
"package": {
"name": "milo/nette-min",
"version": "2.1.0",
"dist": {
"url": "https://dl.dropboxusercontent.com/s/g4i7ccaob2p3bz7/nette-2.1.0-min-milo.zip?dl=1",
"type": "zip"
},
"autoload": {
"files": ["nette.min.php"]
}
}
}
],
"require": {
"php": ">= 5.3.0",
"milo/nette-min": "2.1.0",
"dg/adminer-custom": "1.*"
},
"require-dev": {
"nette/tester": "~0.9.5"
}
}
- David Grudl
- Nette Core | 8228
Myslím, že se to nevyřešilo, prostě s APC se PHAR nemá rád. Takže bych doporučil neminifikovanou verzi.
- David Grudl
- Nette Core | 8228
APC je mrtvý projekt, nové verze už pár let nevycházejí a bugy se neopravují. Je nepravděpodobné, že by se tohle někdy vyřešilo. Takže buď vypni APC, nebo použij neminifikovanou verzi Nette.