выкладываю его для теста на wooohooo.ru. сайт строится на zend + smarty
сейчас столкнулся с тем, что пока нет обращений к базе данных, сайт вроде бы нормально работает, но как идет обращение к базе, сразу же видны очень сильные задержки. в чем может быть проблема? хостинг? код? в заранее благодарен. увидеть торможение можно как на этапе логина, так и на этапе просмотра опубликованных сообщений (чтоб не регится, сразу можно зайти под логином "ИСП" пароль "224224") в кратце о коде.
index.php
<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/Moscow');
//путь до установленного фреймворка
set_include_path('.'.PATH_SEPARATOR . '../libs'
.PATH_SEPARATOR.'../libs/Pear'
.PATH_SEPARATOR.get_include_path());
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace(array('CustomControllerAclManager', 'Templater', 'CustomControllerAction'
, 'DatabaseObject', 'FormProcessor', 'Profile','Text_CAPTCHA'
,'Text_Password','Breadcrumbs','FCKeditor'));
//загрузка конфигурационной информации
$config=new Zend_Config_Ini('../settings.ini','development');
Zend_Registry::set('config',$config);
//создание обьекта для системного журнала
$logger=new Zend_Log(new Zend_Log_Writer_Stream($config->logging->file));
Zend_Registry::set('logger',$logger);
//соединение с базой данных
$params = array('host' => $config->database->hostname,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->database,
'driver_options'=> array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'),
'profiler' => false);
$db = Zend_Db::factory($config->database->type, $params);
Zend_Registry::set('db', $db);
$db->query("set names utf8");
//настройка аутентификации пользователей
$auth = Zend_Auth::getInstance();
$auth->setStorage(new Zend_Auth_Storage_Session());
//обработка запроса пользователя
$controller=Zend_Controller_Front::getInstance();
$controller->throwExceptions(true);
$controller->setControllerDirectory($config->paths->base.'/include/Controllers/');
$controller->registerPlugin(new CustomControllerAclManager($auth));
//настройка визуализации
$vr = new Zend_Controller_Action_Helper_ViewRenderer();
$vr->setView(new Templater());
$vr->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vr);
$controller->throwExceptions(true);
$controller->dispatch();
из AccountController функция
public function loginAction()
{
// if a user's already logged in, send them to their account home page
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity())
$this->_redirect('/account');
$request = $this->getRequest();
// определение страницы, которую изначально запрашивал пользователь
$redirect = $request->getPost('redirect');
if (strlen($redirect) == 0)
$redirect = $request->getServer('REQUEST_URI');
if (strlen($redirect) == 0)
$redirect = '/account';
// инициализация сообщения об ошибке
$errors = array();
// обработка входа, если запрос сделан путем отправления формы
if ($request->isPost()) {
// получение данных из формы и их проверка
$username = $request->getPost('username');
$password = $request->getPost('password');
if (strlen($username) == 0)
$errors['username'] = 'Не введен Логин';
if (strlen($password) == 0)
$errors['password'] = 'Не введен Пароль';
if (count($errors) == 0) {
// настройка параметров адаптера аутентификации
$adapter = new Zend_Auth_Adapter_DbTable($this->db,
'users',
'username',
'password',
'md5(?)');
$adapter->setIdentity($username);
$adapter->setCredential($password);
// попытка аутентификации пользователя
$result = $auth->authenticate($adapter);
if ($result->isValid()) {
$user = new DatabaseObject_User($this->db);
$user->load($adapter->getResultRowObject()->user_id);
// регистрации попытки входа в журнал
$user->loginSuccess();
// запись личных данных пользователя в сеанс
$identity = $user->createAuthIdentity();
$auth->getStorage()->write($identity);
// перенаправление пользователя на запрашиваемую им страницу
$this->_redirect($redirect);
}
// регистрация неудачной попытки входа в журнале
DatabaseObject_User::LoginFailure($username,
$result->getCode());
$errors['username'] = 'Не верный логин или пароль';
}
}
$this->view->errors = $errors;
$this->view->redirect = $redirect;
}
user.php из датабейзобжект
<?php
class DatabaseObject_User extends DatabaseObject
{
static $userTypes = array('member' => 'Member',
'administrator' => 'Administrator');
public $profile = null;
public $_newPassword = null;
public function __construct($db)
{
parent::__construct($db, 'users', 'user_id');
$this->add('username');
$this->add('password');
$this->add('user_type', 'member');
$this->add('ts_created', time(), self::TYPE_TIMESTAMP);
$this->add('ts_last_login', null, self::TYPE_TIMESTAMP);
$this->profile = new Profile_User($db);
}
protected function preInsert()
{
// $this->password = uniqid();
$this->_newPassword = Text_Password::create(8);
$this->password = $this->_newPassword;
return true;
}
protected function postLoad()
{
$this->profile->setUserId($this->getId());
$this->profile->load();
}
protected function postInsert()
{
$this->profile->setUserId($this->getId());
$this->profile->save(false);
$this->sendEmail('user-register.tpl');
return true;
}
protected function postUpdate()
{
$this->profile->save(false);
return true;
}
protected function preDelete()
{
$this->profile->delete();
return true;
}
public function __set($name, $value)
{
switch ($name) {
case 'password':
$value = md5($value);
break;
case 'user_type':
if (!array_key_exists($value, self::$userTypes))
$value = 'member';
break;
}
return parent::__set($name, $value);
}
public function usernameExists($username)
{
$query = sprintf('select count(*) from %s where username = ?',
$this->_table);
$result = $this->_db->fetchOne($query, $username);
return $result > 0;
}
static public function IsValidUsername($username)
{
$validator = new Zend_Validate_Alnum();
return $validator->isValid($username);
}
public function sendEmail($tpl)
{
$templater = new Templater();
$templater->user = $this;
// считывается тело сообщения
$body = $templater->render('email/' . $tpl);
// извлечение темы из первой строки
list($subject, $body) = preg_split('/\r|\n/', $body, 2);
// настройка и отправка сообщения
$mail = new Zend_Mail('UTF-8');
$mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
// помещение адреса доставки и полного имени в строку "кому"
$mail->addTo($this->profile->email,
trim($this->profile->first_name . ' ' .
$this->profile->last_name));
// чтение данных администратора из конфигурационной информации
$mail->setFrom(Zend_Registry::get('config')->email->from->email,
Zend_Registry::get('config')->email->from->name);
// добавление темы и тела, отправки
$mail->setSubject(trim($subject));
$mail->setBodyText(trim($body));
$mail->send();
}
public function createAuthIdentity()
{
$identity = new stdClass;
$identity->user_id = $this->getId();
$identity->username = $this->username;
$identity->user_type = $this->user_type;
$identity->first_name = $this->profile->first_name;
$identity->last_name = $this->profile->last_name;
$identity->email = $this->profile->email;
return $identity;
}
public function loginSuccess()
{
$this->ts_last_login = time();
unset($this->profile->new_password);
unset($this->profile->new_password_ts);
unset($this->profile->new_password_key);
$this->save();
$message = sprintf('Successful login attempt from %s user %s',
$_SERVER['REMOTE_ADDR'],
$this->username);
$logger = Zend_Registry::get('logger');
$logger->notice($message);
}
static public function LoginFailure($username, $code = '')
{
switch ($code) {
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
$reason = 'Unknown username';
break;
case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
$reason = 'Multiple users found with this username';
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
$reason = 'Invalid password';
break;
default:
$reason = '';
}
$message = sprintf('Failed login attempt from %s user %s',
$_SERVER['REMOTE_ADDR'],
$username);
if (strlen($reason) > 0)
$message .= sprintf(' (%s)', $reason);
$logger = Zend_Registry::get('logger');
$logger->warn($message);
}
public function fetchPassword()
{
if (!$this->isSaved())
return false;
// генерация новых параметров пароля
$this->_newPassword = Text_Password::create(8);
$this->profile->new_password = md5($this->_newPassword);
$this->profile->new_password_ts = time();
$this->profile->new_password_key = md5(uniqid() .
$this->getId() .
$this->_newPassword);
// сохранение нового файла в профиле и отправка сообщения.
$this->profile->save();
$this->sendEmail('user-fetch-password.tpl');
return true;
}
public function confirmNewPassword($key)
{
// проверка наличия правильных временных данных
if (!isset($this->profile->new_password)
|| !isset($this->profile->new_password_ts)
|| !isset($this->profile->new_password_key)) {
return false;
}
// проверка подтверждения пароля в течении суток
if (time() - $this->profile->new_password_ts > 86400)
return false;
// проверка правильности ключа
if ($this->profile->new_password_key != $key)
return false;
// все правильно принимаем новый пароль для учетной записи
// пропускаем локальный уровень, новый пароль уже в md5
parent::__set('password', $this->profile->new_password);
unset($this->profile->new_password);
unset($this->profile->new_password_ts);
unset($this->profile->new_password_key);
// сохранение учетных данных и профиля пользователя
return $this->save();
}
}
?>