Prázdný výstup, pád v error_logu (apache)
- repli2dev
- Člen | 57
Měl jsem problém a zastaralejší Nette, po updatu jsem měl problémy dva, jejichž projev je téměř stejný:
1. (Po updatu) místo stránky na které mám v kódu formulář, které mu
přidávám pravidlo pomocí addRule(…) vidím jen prázdnou stránku, výstup
není žádný – v logu apache pak najdu
[Tue Mar 24 15:42:54 2009] [notice] child pid 19291 exit signal Segmentation fault (11)
Tento problém jsem vyřešil rekompilací php navíc s USEflagy
posix calendar cgi ctype curl date hash json mysqli pdo postrgres simplexml xsl xmlwriter
–
přesněji nevím, chvilku to trvá.
2. (Po i před updatem) místo stránky která má vyhodit výjimku autotentifikace při zadání špatných údajů (dle příkladu Akrobat.forms) se zobrazí prázdná stránka (stejná chyba u apache jako v předchozím případě), přihlášení se správnými údaji proběhne OK.
Zkoušel jsem web nasadit na klenot.cz, tam se však chyba vůbec neprojeví. Vše funguje jak očekávám.
Nenapadá někoho, kde by mohl být problém?
Apache 2.2.11 a PHP 5.2.8-r2 (zkoušel jsem i php 5.2.6-r7 – stejný
výsledek).
Editoval repli2dev (24. 3. 2009 15:59)
- David Grudl
- Nette Core | 8228
Máš možnost kód krokovat? Tohle vypadá na chybu mimo jazyk PHP (tedy v PHP samotném nebo nějaké knihovně) a dost těžko se dohledává.
- repli2dev
- Člen | 57
Přeci jen se mi podařilo něco vydolovat:
( ! ) Fatal error: Class 'SignalException' not found in /home/mamka/www/libs/Nette/Application/AppForm.php on line 122
(po přidání parametru xdebug do url.
Zcestné, vzniklo chybou v url.
Tak akrobat.forms už funguje, zkoušel jsem metodou copy paste vykoumat který kód to shodí v mém projektu a je to vyhazování podmínek v autentizační třídě:
<?php
/**
* Users authenticator.
*/
class Users extends Object implements IAuthenticator{
protected $connection;
public function __construct(){
dibi::connect(Environment::getConfig('database'));
$this->connection = dibi::getConnection();
//print_r($this->connection);
}
public function authenticate(array $credentials){
$username = strtolower($credentials[self::USERNAME]);
$password = $credentials[self::PASSWORD];
$row = $this->connection->select('*')->from('users')->where('username=%s', $username)->fetch();
if (!$row) {
throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
} else
if ($row->password !== sha1($credentials[self::PASSWORD])) {
throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
}
unset($row->password);
return new Identity($row->username, NULL, $row);
}
}
Voláno z
<?php
/**
* Default presenter - showing entries from db table chosen by URL
*/
class UsersPresenter extends BasePresenter
{
protected $model;
protected function startup(){
//new model
$this->model = new EntriesModel;
}
protected function beforeRender(){
// fetching menu data
$this->template->rows = $this->model->getMenu();
// user info
$user = Environment::getUser();
$this->template->user = $user->isAuthenticated() ? $user->getIdentity() : NULL;
}
public function renderDefault(){
$user = Environment::getUser();
if (!$user->isAuthenticated()){
$this->redirect('Users:Login');
}
}
public function actionLogin(){
$form = new AppForm($this, 'noteForm');
$form->addText('username', 'Uživatelské jméno:')
->addRule(Form::FILLED, 'Vyplňte prosím uživatelské jméno.');
$form->addPassword('password', 'Heslo:')
->addRule(Form::FILLED, 'Vyplňte prosím heslo.');
$form->addSubmit('send', 'Přihlásit');
$form->onSubmit[] = array($this,'formSubmitted');
$form->addProtection('Prosím odešlete tento formulář znovu (bezpečnostní kód vypršel).');
$this->template->form = $form;
}
public function formSubmitted($form){
try{
$user = Environment::getUser();
$user->authenticate($form['username']->getValue(), $form['password']->getValue());
$this->redirect('Users:');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
public function renderLogout(){
$user = Environment::getUser();
$user->signOut();
$this->redirect('Users:');
}
}
Edit: Tak akrobat sice vyhodí výjimku, ale stejně jako moje autorizace shodí apache na SIGSEGV
Editoval repli2dev (24. 3. 2009 18:47)