banan.cz a nefunkční Nette
- TanisCZ
- Člen | 80
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
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
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
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
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
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)
- David Grudl
- Nette Core | 8218
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.
- David Grudl
- Nette Core | 8218
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.
- David Grudl
- Nette Core | 8218
Zkusil jsem tu kompatibilitu s PHP 5.2 doplnit do poslední revize. Řeší i otazník na konci URL.
- Ondřej Mirtes
- Člen | 1536
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
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;
.
- David Grudl
- Nette Core | 8218
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
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
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)