Po volání loadConfig se zobrazí Internal Server Error
- mrdec
- Člen | 19
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
// ...
?>
- mrdec
- Člen | 19
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
.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>
- mrdec
- Člen | 19
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)
- iguana007
- Člen | 970
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
- Vyki
- Člen | 388
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
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.