Cannot redeclare class nette\latte\engine in phar

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

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)

Robyer
Člen | 74
+
0
-

Mám stejný problém s minifikovanou phar verzí Nette 2.1.0. A také používám wedos hosting.

webdata
Člen | 153
+
0
-

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.

Robyer
Člen | 74
+
0
-

Teď jsem to zkoušel a normální (neminifikovaná) verze funguje ;-) (php 5.4)

Editoval Robyer (3. 1. 2014 12:21)

webdata
Člen | 153
+
0
-

Robyer napsal(a):

Teď jsem to zkoušel a normální (neminifikovaná) verze funguje ;-) (php 5.4)

tak to hodit jako pull na git :-)

David Grudl
Nette Core | 8228
+
0
-

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
+
0
-

Ještě mě něco napadlo… můžete vyzkoušet tento PHAR pod 5.4 s APC? https://dl.dropboxusercontent.com/…3/nette.phar

Robyer
Člen | 74
+
0
-

@David Grudl: Bohužel nepomohlo.

Milo
Nette Core | 1283
+
0
-

Zkouším to na svém serveru s PHP 5.4.4 a APC a sandbox mi běží v pořádku. Mohli byste sem, prosím, pastnout celou sekci APC z phpInfo()?

Editoval Milo (3. 1. 2014 15:42)

Milo
Nette Core | 1283
+
0
-

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
+
0
-

@David Grudl Co je jinak v tom PHAR co jsi nahrál na dropbox? S ním dostávám hlášku co pánové.

require(): Cannot redeclare class nette\latte\engine

EDIT: Už to vidím.

Editoval Milo (3. 1. 2014 16:23)

Robyer
Člen | 74
+
0
-

Milo napsal(a):

Také tam píšou, že pro PHP 5.4 můžete změnit apc.enable. Zkusíte ji vypnout?

Vypnul jsem a už to funguje bez chyby.

Editoval Robyer (3. 1. 2014 16:08)

Filip Procházka
Moderator | 4668
+
0
-

APC is dead, long live opcache :P

enumag
Člen | 2118
+
0
-

Imho Nette should throw some warning if it detects APC. At least in Requirements checker.

Milo
Nette Core | 1283
+
0
-

Tak chybu nasimulovat umím, ale teď mě čeká cestování. Kouknu na to buď večer nebo během víkendu. Jak se zdá, může za to APC a její vypnutí by mělo pomoct.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nicméně vypínání APC je z hlediska výkonu dost hloupé.

Milo
Nette Core | 1283
+
0
-

@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?

Robyer
Člen | 74
+
0
-

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á.

webdata
Člen | 153
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 pharu.

Filip Procházka
Moderator | 4668
+
0
-

Já bych taky ocenil dvě verze, v 5.5 phar funguje výborně.

Milo
Nette Core | 1283
+
0
-

Stále hledám a debuguji…

Milo
Nette Core | 1283
+
0
-

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
+
0
-

Na dropbox jsem nahrál minifikovanou verzi Nette 2.1.0. Je vytvořena z:

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.

Download

Editoval Milo (8. 1. 2014 22:05)

Robyer
Člen | 74
+
0
-

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
+
0
-

@Robyer Můžeš si to inlinovat do projektu pomocí package repozitáře

Robyer
Člen | 74
+
0
-

@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
+
0
-

@Robyer Ten autoload file se jmenuje nette.min.php (tečka místo pomlčky). Jinak to máš OK, přesně takhle mi s tím běží 2.1 sandbox.

Milo
Nette Core | 1283
+
0
-

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"
	}
}
Robyer
Člen | 74
+
0
-

@Milo, díky, vyřešeno.

Myiyk
Člen | 321
+
0
-

Oficiální nette.phar nefunguje, hlásí chybu require(): Cannot redeclare class nette\latte\engine
(verze 2.1.1, jede na wedos, php 5.4)

Testnu nějakou upravenou verzi, které jsou tady zmíněny.

David Grudl
Nette Core | 8228
+
0
-

Myslím, že se to nevyřešilo, prostě s APC se PHAR nemá rád. Takže bych doporučil neminifikovanou verzi.

Re4DeR
Člen | 71
+
0
-

vyřešilo se to nějak ? mám ted stejný problém

David Grudl
Nette Core | 8228
+
0
-

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.