Po volání loadConfig se zobrazí Internal Server Error

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

Ahoj,
mám problem s nasazením Nette na hostingu (konkrétně na Hostmonster). Už jsem vcelku zoufalý, snažím se tam aspoň rozjet ukazkový example z Nette CD-collection (na lokále mi to samozřejmě funguje bez problémů).

Experimentálně jsem zjistil, že se to dostane až do bootstrap.php k řádku Environment::loadConfig();. Poté, co se tento řádek spustí, v prohlížeči se zobrazí „Internal Server Error“.

Všechno mám stejné jako v tom examplu, jen jsem změnil adresářovou strukturu (protože doména ukazuje do kořenové složky a né do adresáře document_root).

Adresářová struktura je:

app
app/log  - má chmod 777
app/models/...
app/templates/...
app/temp  - má chmod 777
app/templates/...
app/.htaccess
app/bootstrap.php
app/config.ini
libs/
libs/Nette/....
.htaccess
index.php

index.php obsahuje:

<?php
define('WWW_DIR', dirname(__FILE__));
define('APP_DIR', WWW_DIR . '/app');
define('LIBS_DIR', WWW_DIR . '/libs');
require APP_DIR . '/bootstrap.php';
?>

bootstrap.php obsahuje:

<?php
require LIBS_DIR . '/Nette/loader.php';
Debug::enable(true, APP_DIR . '/log/error-ladenka.log');

// sem to projde
Environment::loadConfig();
// sem to už neprojde, zobrazí se: 500 Internal Server Error

// ...
?>
Ondřej Mirtes
Člen | 1536
+
0
-

Ukaž config.ini :)

Aurielle
Člen | 1281
+
0
-

Co máš v .htaccessu? Mě funguje jeden projekt v Nette na hostmonsteru správně (ale ještě psaný pod Nette 0.8)

mrdec
Člen | 19
+
0
-

config.ini je stejný jako v tom examplu, takže:

[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "%encoding%"

; services
service.Nette-Security-IAuthenticator = Users

service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE

[production < common]
; common database connection
database.driver = sqlite
database.file = "%appDir%/models/demo.db"
database.lazy = TRUE

[development < production]
; database options in development mode
database.profiler = TRUE
mrdec
Člen | 19
+
0
-

.htaccess jsem taky něměnil:

# disable directory listing
Options -Indexes

# mod_rewrite
<IfModule mod_rewrite.c>
	RewriteEngine On
	# RewriteBase /

	# 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]
</IfModule>
iguana007
Člen | 970
+
0
-

máš přístup k error.log – pokud ano, tak co se v něm zobrazí?

mrdec
Člen | 19
+
0
-

Vytváří se mi v rootu soubor error_log, ale v něm se objevuje jen:

[24-Jan-2010 06:46:12] PHP Warning:  Module 'PDO' already loaded in Unknown on line 0
[24-Jan-2010 06:46:12] PHP Warning:  Module 'PDO' already loaded in Unknown on line 0
...

Ale nevim, jestli to s tím nějak souvisí.. objevuje se mi to totiž i u jiných „ne-Nette“ aplikací (které fungují). A taky u jedné napůl Nette aplikace (taky funkční) na stejném hostingu (která využívá jen Form a nikoliv Application nebo Environment).

Editoval mrdec (24. 1. 2010 15:17)

Vyki
Člen | 388
+
0
-

Odkomentuj v .htaccess RewriteBase / a mrkni jestli to pujde. Internal Server Error se mi většinou zobrazuje když je problém s .htaccess nebo při příšerných cyklech když nepoužiju reference :o)

Editoval Vyki (24. 1. 2010 15:26)

iguana007
Člen | 970
+
0
-

Nebo taky, pokud ti to bezi nekde jinde nez v rootu domeny, tak by RewriteBase mel odpovidat relativni ceste od rootu domeny, takze kdyz mas document root treba na: www.mojedomena.cz/…aciaplikace/
tak by si v RewriteBase mel mit hodnotu /testovaciaplikace/

igi

mrdec
Člen | 19
+
0
-

To odkomentování RewriteBase / v .htaccess nepomohlo. :-(

iguana007
Člen | 970
+
0
-

zkus zakomentovat radek: Options -Indexes
mozna ze to mas na hostingu zakazane a muze to zpusobovat 500vku.

igi

mrdec
Člen | 19
+
0
-

Díky za tipy, ale ani to zakomentování Options -Indexes nepomohlo. Je to peklo. :-(

Zatím jsem zjistil, že se to dostane až do metody Environment::loadConfig z tama se ještě zavolá Configurator::loadConfig a v něm to umře na volání Environment::getName.

Ondřej Mirtes
Člen | 1536
+
0
-

Zkus odstraňovat jednotlivé řádky z config.ini.

mrdec
Člen | 19
+
0
-

Takže jem pokročil dál.. v Environment::getName se volá Environment::getVariable('environment') a v ní to umře na volání této php funkce: get_defined_constants(TRUE).

mrdec
Člen | 19
+
0
-

Přitom, když dám na ten hosting tento samostatný skriptík, tak s ním nemá žádný problém a vypíše to.

<?php
define('AAA', 'AaA');
print_r(get_defined_constants());
?>
mrdec
Člen | 19
+
0
-

Jo ale pokud tam dám volání s TRUE, tak to umře.

<?php
define('AAA', 'AaA');
print_r(get_defined_constants(TRUE));
?>

Ještě doplňuji, že tam běží PHP verze 5.2.11.

Editoval mrdec (24. 1. 2010 17:48)

Vyki
Člen | 388
+
0
-

Tak umřít skript na tomhle jsem ještě neviděl :o) Našel jsem, že problém s touto funkcí souvisí s nkonzistentním chováním pod linux a windows. Máš to na serveru s woknama nebo linuxem? EDIT: .. což se ale týkalo až PHP 5.3. http://bugs.php.net/bug.php?… – zde je něco o té chybě pro PHP 5.2.11

Editoval Vyki (24. 1. 2010 19:22)

mrdec
Člen | 19
+
0
-

Jede to na linuxu… zkoušel jsem tento pidi-skript spustit na dalších třech hostinzích a na nich fungoval.. jen na tom Hostmonsteru to hodí Invalid Server Error (když to volám s tím parametrem TRUE, bez něj je to vpohodě).

mrdec
Člen | 19
+
0
-

Vyřešeno, jupííííí! Takže, chyba byla v opravdu v tom varování z error_logu:

[24-Jan-2010 06:46:12] PHP Warning:  Module 'PDO' already loaded in Unknown on line 0
[24-Jan-2010 06:46:12] PHP Warning:  Module 'PDO' already loaded in Unknown on line 0

Šlo o to, že jsem v rootu neměl žádný php.ini, takže se použil asi nějaký výchozí, který obsahoval chyby. Nechal jsem si v administračním rozhraní Hostmonsteru vygenerovat výchozí php.ini.
To se udělá tak, že po přihlášení se v cPanelu klikne na PHP Config a klikne se na tlačítko INSTALL PHP.INI MASTER FILE. Vygeneruje se php.ini.default, které si přejmenujete na php.ini a dáte do rootu.

Problém byl ale v tom, že to moje vygenorované php.ini obsahovalo chyby! Na konci souboru se přidávaly extensions a byl tam tento kód:

extension=pdo.so
extension=pdo_sqlite.so
extension=sqlite.so
extension="pdo.so"             <-- zde je redeklarace
extension="pdo.so"             <-- a tady další
extension="pdo_pgsql.so"
extension=pdo_mysql.so

Vidíte to, je tam třikrát deklarované PDO extension. Tak jsem ty poslední dvě deklarace smazal a smazal jsem radši i ty uvozovky u extension="pdo_pgsql.so" a najednou se vše zázračně rozběhlo. error_log už nic nehlásí a s voláním get_defined_constants(TRUE) už taky není problém… a tím pádem běží i Nette aplikace. :-)

Tak třeba to někomu dalšímu ušetří čas a nervy. Děkuji všem, co se mi snažili pomoct.

David Grudl
Nette Core | 8111
+
0
-
jasir
Člen | 746
+
0
-

…featuring Mrdec

;-) vítej na fóru :-)