banan.cz a nefunkční Nette

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

Zdravím, rád bych v budoucnu využil Nette framework pro své některé webové aplikace. Máme hosting na bananu.cz, což jsem nemohl ovlivnit, ale už se s tím nedá nic dělat.

A na bananu mi nejde spustit Nette. Píše mi to 3 chyby :

Warning: call_user_func(Route::view2path) [function.call-user-func]: Unable to call Route::view2path(default) in /subdomains/test/libs/Nette/Application/Route.php on line 443

Warning: call_user_func(Route::presenter2path) [function.call-user-func]: Unable to call Route::presenter2path(Aukce) in /subdomains/test/libs/Nette/Application/Route.php on line 443

Fatal error: Uncaught exception ‚ApplicationException‘ with message ‚Nette\Application needs PHP 5.2.2 or newer.‘ subdomains/test/libs/Nette/Application/Application.php:89 Stack trace: #0 subdomains/test/app/bootstrap.php(36): Application->run() #1 subdomains/test/index.php(6): require(‚/home/www/…‘) #2 {main} thrown in /subdomains/test/libs/Nette/Application/Application.php on line 89

Na foru jsem se dočetl, že Nette by mělo fungovat s verzí PHP 5.1 a vyšší
Na bananu je PHP Version 5.2.0–8+etch1 s povoleným mod_rewrite

Nevíte kde by mohl být problém?

Předem díky

David Grudl
Nette Core | 8218
+
0
-

Určitě budou mít víc serverů, tak je zkus požádat, aby tvou prezentaci přesunuli na server s nejnovějším PHP. Nette sice vyžaduje PHP 5.1, ale kvůli chybám v různých verzích PHP nemusí ve všech fungovat spolehlivě.

kinodont
Člen | 3
+
0
-

Ještě bych dodal, že aktuální Nette už vyžaduje minimálně PHP verzi 5.2.3. Je to proto, že s call_user_func a call_user_func_array je volána statická funkce se syntaxí, která je platná až od výše zmíněné verze PHP. V PHP manuálu je uveden tento příklad:

<?php
$classname = "myclass";

call_user_func(array($classname, 'say_hello')); // Původní volání statické funkce
call_user_func($classname .'::say_hello'); // As of 5.2.3
?>

Proto to dává ve starších verzích hlášku unable to call …. Toho se jde jednoduše zbavit tím voláním s polem, které by mělo fungovat ve všech verzích PHP.

Dále také spuštění Nette v nižních verzích než 5.2.2 vyhodí výjimku, asi právě kvůli té nové syntaxi call_user_func.

<?php
/**
 * Check configuration.
 */
if (version_compare(PHP_VERSION , '5.2.2', '<')) {
	throw new /*::*/RuntimeException('Nette\Application needs PHP 5.2.2 or newer.');
}
?>

Jak jsem se tak na to díval, tak je tam ta podmínka už od prvního přidání souboru Application.php v revizi 14.

Ty verze PHP, pod kterými Nette funguje, nemám odzkoušené, jenom vím, že v 5.2.0 nefunguje, v 5.2.4 a 5.2.6 už funguje. Podle PHP manuálu to ale vychází tak, že Nette funguje až od 5.2.3.

Nebo mi něco uniklo?

David Grudl
Nette Core | 8218
+
0
-

kinodont napsal(a):

Ještě bych dodal, že aktuální Nette už vyžaduje minimálně PHP verzi 5.2.3. Je to proto, že s call_user_func a call_user_func_array je volána statická funkce se syntaxí, která je platná až od výše zmíněné verze PHP. V PHP manuálu je uveden tento příklad:

Máš pravdu. Díval jsem se, že tento způsob volání se používá ve třídách Route, Rules a Template. Dalo by se to pozměnit, jenže:

  • v PHP < 5.2.0 nefunguje __toString, kterého se v řadě situací využívá
  • v PHP 5.2.0 je zkurvený overloading
  • v PHP 5.2.1 je chyba, co shodí Apache (naživo se mi stalo při loňské přednášce a kvůli tomu je tam ta výjimka)
  • v PHP 5.2.2 už call_user_func($classname .‚::say_hello‘) funguje (vyzkoušeno, ač dokumentace uvádí verzi vyšší)

Takže to vidím spíš tak, že opravím minimální požadovanou verzi v dokumentaci. Sice půlka tříd poběží i v PHP 5.1.0, ale druhá ne a nechci zbytečně mást uživatele.

deric
Člen | 93
+
0
-

Na spoustě serverů běží Debian Etch, který má aktuálně poslední stabilní verzi php 5.2.0, což je zhruba 2roky stará verze. Admini obvykle neradi provádějí upgrade na unstable. Nová verze „Lenny“ obsahuje php 5.2.6 a mohla by co nevidět vyjít. To by doufám mohlo vyřešit problémy na některých serverech.

cuga
Člen | 210
+
0
-

podarilo se ti to na tom bananu nejak rozjet?

zkusil sem si tam ted neco v nette nahodit a haze mi to 500… odhlalil sem, ze to chcipne az u $application->run();

Pokud to zakomentuju, vrati mi server 200, jinak 500… zkusil sem ten osvedceny postup zakomentovat, smaznout cache, odkomentovat a jedeme, ale prd :)

u tempu mam prava 777, takze tam problem neni…

Editoval cuga (29. 11. 2008 17:08)

Ola
Člen | 385
+
0
-

Zdravím, nešlo by to na tom 5.2.0 přeci-jen nějak rozjet? Už u dvou hostingů které používá klient tahle verze byla (vč. debianu etch)

David Grudl
Nette Core | 8218
+
0
-

Zkus v Application.php odstranit

	if (version_compare(PHP_VERSION , '5.2.2', '<')) {
		throw new /*\*/ApplicationException('Nette\Application needs PHP 5.2.2 or newer.');
	}

a všechny call_user_func($neco, ... a call_user_func_array($neco, ... nahradit za call_user_func(fixCallback($neco), ... a call_user_func_array(fixCallback($neco), .... Funkce fixCallback by vypadala takto:

function fixCallback($callback)
{
	if (is_string($callback)) {
		$pair = explode('::', $callback);
		return count($pair) > 1 ? $pair : $callback;
	} else {
		return $callback;
	}
}

Ještě metody Environment::expandCb, CurlyBracketsFilter::cb a TemplateFilters::tnlCb a texyCb musí být public. – nemusí.

Pak by to mělo víceméně fungovat.

Ola
Člen | 385
+
0
-

Díky moc! Vyzkouším a podám feedback :)

EDIT: Funguje! Mnohokráte díky!

Editoval Ola (28. 12. 2008 15:13)

David Grudl
Nette Core | 8218
+
0
-

Ještě takto: nedá se nijak rozumně obejít chyba PHP Indirect modification of overloaded property. To vyžaduje přepsat části kódu tak, aby se v určitých případech overloading nepoužíval (tam, kde je overloadovaná proměnná pole). Místa, která je potřeba upravit, najdeš tak, že PHP ohlásí Notice: Indirect modification of overloaded property Class::$propery has no effect in ... on line ....

Kdyby šlo jen o ty callbacky, klidně podporu pro PHP 5.2.0 doplnil.

Ola
Člen | 385
+
0
-

Tak ještě mi tu trochu blbnou adresy, mám místo např. domena.tld/toto-je-url-clanku tuto url: domena.tld/toto-je-url-clanku? – je tam přidanej ke konci otazník

David Grudl
Nette Core | 8218
+
0
-

Zkusil jsem tu kompatibilitu s PHP 5.2 doplnit do poslední revize. Řeší i otazník na konci URL.

Ola
Člen | 385
+
0
-

Super, díky :)

Ondřej Mirtes
Člen | 1536
+
0
-

Uff, tak mám také problém s webhostingem (jeden malý slovenský webhoster, dělám pro něj weby, tak mám u něj také hosting). Doma na localhostu (PHP 5.2.8) mi následující kód jede v pořádku:

$template->answers = array();
for ($i=1; $i<=5; $i++)
{
    if ($poll->isAnswer($i))
    {
        $template->answers[$i] = $latestPoll["answer".$i];
    }
    else break;
}

Když ale projekt přesunu na webhosting (PHP 5.2.0, Debian Etch), do pole se nic nepřiřazuje. Povolil jsem zobrazování notice a hle: Indirect modification of overloaded property.

Mám jít kopat do webhostera, aby updatnul? Nebo se to dá nějak obejít?

UPDATE: Vyřešeno. Tenhle kód zafungoval:

$answers = array();
for ($i=1; $i<=5; $i++)
{
    if ($poll->isAnswer($i))
    {
        $answers[$i] = $latestPoll["answer".$i];
    }
    else break;
}

$template->answers = $answers;

Editoval LastHunter (11. 2. 2009 2:20)

David Grudl
Nette Core | 8218
+
0
-

Ano, to je bohužel nepříjemná chyba PHP 5.2.0. Pokud by to nevadilo jiné části kódu, dá se obejít i tím, že v první ukázce se místo $template->answers = array(); použije $template->answers = new ArrayObject;.

hrach
Člen | 1838
+
0
-

@David: Můžeš tu chybu rozvést prosím přesněji? :) Díky

David Grudl
Nette Core | 8218
+
0
-

hrach napsal(a):

@David: Můžeš tu chybu rozvést prosím přesněji? :) Díky

Zkus juknout sem http://bugs.php.net/bug.php?…

wdolek
Člen | 331
+
0
-

tak z toho jsem drobatko jelen – take mam hosting u bananu, a neco sem splodil v Nette… na serveru je verze „PHP Version 5.2.4–2ubuntu5.1“, ale haze mi to „500 Internal Server Error“… (5.1 je verze ceho, z toho popisku?!)

s tim tedy, ze kdyz vlezu na „www.domena.tld/“ tak to jde, ale jakmile za to nakladu treba jen „index.php“ nebo „foo/“ „bar/“ … cokoliv proste, tak to leti a pada…

… a leti to do erroru i pri „Debug::enable(E_ALL | E_STRICT);“ … a bohuzel, v logu pro hosting jsou nejake tyden stare zaznamy (a jeste jen 2) … takze fakt nejak nechapu, co s tim :(

v htaccess mam

# disable directory listing
Options -Indexes

# mod_rewrite
RewriteEngine On

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

na lokale, windoze vista, apache 2.2, PHP 5.2.8 vse bezi jak ma :P

Editoval wdolek (21. 2. 2009 16:32)

Ondřej Mirtes
Člen | 1536
+
0
-

wdolek napsal(a):

tak z toho jsem drobatko jelen – take mam hosting u bananu, a neco sem splodil v Nette… na serveru je verze „PHP Version 5.2.4–2ubuntu5.1“, ale haze mi to „500 Internal Server Error“… (5.1 je verze ceho, z toho popisku?!)

s tim tedy, ze kdyz vlezu na „www.domena.tld/“ tak to jde, ale jakmile za to nakladu treba jen „index.php“ nebo „foo/“ „bar/“ … cokoliv proste, tak to leti a pada…

… a leti to do erroru i pri „Debug::enable(E_ALL | E_STRICT);“ … a bohuzel, v logu pro hosting jsou nejake tyden stare zaznamy (a jeste jen 2) … takze fakt nejak nechapu, co s tim :(

v htaccess mam

# disable directory listing
Options -Indexes

# mod_rewrite
RewriteEngine On

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

na lokale, windoze vista, apache 2.2, PHP 5.2.8 vse bezi jak ma :P

wdolek: Vynut si v bootstrapu development mode (napr. Environment::setMode('development') – doufam, ze se nepletu) a uvidis ten error.

Editoval LastHunter (21. 2. 2009 16:40)

wdolek
Člen | 331
+
0
-

LastHunter: pozadal sem helpdesk o zaslani logu serveru, oni mi odpovedeli, ze chyba je prave v RewriteRule

RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]

:(

Jod
Člen | 701
+
0
-

Skús si pridať rewrite base, inak mám rovnaký konfig ako ty okrem toho options a všetko mi ide, takže chyba nemôže byť v configu.

RewriteBase /

Editoval Jod (21. 2. 2009 17:37)

wdolek
Člen | 331
+
0
-

Jod napsal(a):

Skús si pridať rewrite base, inak mám rovnaký konfig ako ty okrem toho options a všetko mi ide, takže chyba nemôže byť v configu.

RewriteBase /

:) voala, ano, tak to bylo ono ;) diky moc

Jod
Člen | 701
+
0
-

V pohode, mal som rovnaký problém :)