Forum Webscript.Ru

Программирование => Perl => Тема начата: pirojok от 15 Ноября 2007, 22:29:01

Название: Ускорение(оптимизация) работы скрипта.
Отправлено: pirojok от 15 Ноября 2007, 22:29:01
Добрый день.

есть самописный скрипт фотогаллереи работающий с MySQL.

Он имеет следующию структуру:

главный файл
                       модули

В отдельные файлы, модули вынесены подпрограммы работы с БД, с сессиями, загрузка файлов и т.д.
Насколько мне извесно при работе с БД, очень много времени тратиться на установку соединения.

my $dbh = DBI->connect($dsn, $db_user_name, $db_password)|| die "Error while conecting to DB: $DBI::errstr()";


Вопрос в следующем:
в большинстве подключаемых модулей я соединяюсь с БД. Я попробовал использовать соединение которое осуществляеться в главном файле для всех модулей.
Сделал я это  следующим образом:
В модуле создал ссылку на $dbh
[/phpl]
$dbh_ref=\\$dbh
[/code]

а главном файле сделал вот так


my $dsn = \'DBI:mysql:xxxxxxxxxxx.ru\';
my $dbh = DBI->connect($dsn, $db_user_name, $db_password)|| die "Error while conecting to DB: $DBI::errstr()";
$$dbh_ref=$dbh;



В модуле который работает с сессиями это походу не прокатывает(выдаёт ошибку). В остальном прекрасно работает.
[code=perl]
Can\'t connect to data source , no database driver specified and DBI_DSN env var not set at /usr/local/lib/perl5/site_perl/5.8.8/CGI/Session/Driver/DBI.pm line 23
[/php]

Вот пример как всу устроено в модуле сессий:

package security; #Íàçâàíèå ïàêåòà è êëàññà

########################################################
#Êëàññ
########################################################

use Exporter;
@ISA=(\'Exporter\');
@EXPORT=qw(&ses $dbh_ref);
use CGI::Session;
#use DBI;
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use expiresessions;
use error_log;
########################################################
$CGI::Session::MySQL::TABLE_NAME = \'kr_sessions\';
my $cgi = new CGI;
$dbh_ref=\\$dbh;


my $sql="SELECT * FROM kr_users WHERE id=$user_id";
                  my $sql_request=$dbh->prepare(qq[$sql]);
                  $sql_request->execute || error_log("Error while to execute the SQL comand $sql: $DBI::errstr()");
                  %OUT=%{$sql_request->fetchrow_hashref};


В чём может быть причина ошибки? вообще так можно делать?

И ещё вопрос если в главном файле подключены модули типо:
#!/usr/bin/perl
use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser);
use File::Path;
use DBI;
use Time::HiRes qw(time);

Надо ли эти же модули поключать в своих(самописных)?
В примере предоставленном выше, строка use DBI закоментирована, но модуль всё равно хорошо работает с Mysql.
Название: Ускорение(оптимизация) работы скрипта.
Отправлено: Yaroslav от 18 Ноября 2007, 23:46:52
все проще, ты один раз подключаешся
$dbh = DBI->connect("DBI:mysql:urp_baza;localhost",
а дальше просто без лишних движений выбираешь то что нужно
$ary_ref = $dbh->selectall_arrayref("SELECT data, time.
после чего (ли до того) можно подключать твои подпрограмы (модули) и тожен не парясь делать что угодно, например так:
$dbh->do("insert, update и delete....
еще что то делаем скриптом и опять что то
$count = $dbh->selectrow_array("SELECT COUNT(*)...
и так до бесконечности

самое главное незаюбывать о
$sth->finish;
и о очистке масивов
@row=();