Optymalizacja skryptów PHP i zapytań SQL



Podobne dokumenty
TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Wprowadzenie do Doctrine ORM

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Zakres tematyczny dotyczący kursu PHP i MySQL - Podstawy pracy z dynamicznymi stronami internetowymi

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Autor: Joanna Karwowska

Wykład 5: PHP: praca z bazą danych MySQL

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Laboratorium 7 Blog: dodawanie i edycja wpisów

PHP i MySQL dla każdego / Marcin Lis. Wyd. 3. Gliwice, cop Spis treści

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Aplikacje WWW - laboratorium

Administracja bazami danych

PHP: bazy danych, SQL, AJAX i JSON

Podstawy technologii WWW

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

Podstawy programowania III WYKŁAD 2

Programowanie obiektowe

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Smarty PHP. Leksykon kieszonkowy

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

BAZY DANYCH. Obsługa bazy z poziomu języka PHP. opracowanie: Michał Lech

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Baza danych sql. 1. Wprowadzenie

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Dokumentacja fillup - MS SQL

Bazy danych i strony WWW

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

PHP: bloki kodu, tablice, obiekty i formularze

Dodawanie operacji dodatkowych w WAPRO Mag.

Struktura drzewa w MySQL. Michał Tyszczenko

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII

Należy ściągnąć oprogramowanie Apache na platformę

Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller

Spis treści. Wstęp 5 Rozdział 1. Praca z AJAX-em 9. Rozdział 2. Współpraca ze skryptami PHP 55. Rozdział 3. Obsługa formularzy 81

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Projektowani Systemów Inf.

SSI Katalog. Program do katalogowania zawartości dysków. Dariusz Kalinowski

6. Bezpieczeństwo przy współpracy z bazami danych

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Internetowe bazy danych

Umieszczanie kodu. kod skryptu

Paweł Rajba

Wdrożenie modułu płatności eservice. dla systemu Magento

Laboratorium 6 Tworzenie bloga w Zend Framework

Aplikacje WWW - laboratorium

Aplikacje internetowe - laboratorium

Podstawy technologii WWW

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Bazy Danych i Usługi Sieciowe

Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Leszek Stasiak Zastosowanie technologii LINQ w

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Bazy danych. Polecenia SQL

Podstawy JavaScript ćwiczenia

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Kopie bezpieczeństwa NAPRAWA BAZ DANYCH

Zmienne i stałe w PHP

E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL.

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Aplikacje WWW - laboratorium

Instalacja SQL Server Express. Logowanie na stronie Microsoftu

MVC w praktyce tworzymy system artykułów. cz. 1

Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

PROGRAM NAUCZANIA DLA ZAWODU TECHNIK INFORMATYK, O STRUKTURZE PRZEDMIOTOWEJ

Wykład 5. SQL praca z tabelami 2

INSTALACJA I KONFIGURACJA SERWERA PHP.

I. Informacje ogólne. Jednym z takich systemów jest Mambo.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Język SQL, zajęcia nr 1

Laboratorium 1 Wprowadzenie do PHP

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Składowane procedury i funkcje

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

1 Przygotował: mgr inż. Maciej Lasota

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Materiały do laboratorium MS ACCESS BASIC

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

15. Funkcje i procedury składowane PL/SQL

Pomoc dla systemu WordPress

Wysyłanie pliku na serwer. Plik na serwerze.

Zmiany funkcjonalne i lista obsłużonych zgłoszeń Comarch DMS , Comarch DMS i Comarch DMS

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED

Budowa aplikacji ASP.NET współpracującej z bazą dany do przeprowadzania ankiet internetowych

Wykład 05 Bazy danych

Ćwiczenie zapytań języka bazy danych PostgreSQL

Usługi sieciowe systemu Linux

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Bloki anonimowe w PL/SQL

Transkrypt:

Artykuł pobrano ze strony eioba.pl Optymalizacja skryptów PHP i zapytań SQL Jak przyspieszyć skrypty PHP i zapytania do baz danych? Jak skonfigurować narzędzie Xdebug? Jak zmierzyć wydajność skryptu za pomocą Apache Benchmark? PHP jest językiem interpretowanym po stronie serwera. Do przeglądarki jest wysyłany jedynie wynik jego działania. W typowym serwisie internetowym serwer po otrzymaniu żądania pobiera niezbędne rekordy (np. treść strony i informacje o użytkowniku) z bazy danych, a następnie przetwarza je i wysyła do klienta. Przy dobrze zoptymalizowanym kodzie może on obsłużyć znacznie więcej internautów w określonym czasie. Zacznij od... Xdebug Podczas pisania aplikacji PHP i jej optymalizacji pomocne jest rozszerzenie Xdebug, ponieważ: wyświetla czas wykonywania się funkcji oraz użycie pamięci w przypadku wystąpienia błędu oferuje funkcje wyświetlające np. całkowity czas interpretacji kodu, szczytowe użycie pamięci... generuje pliki ze szczegółowymi informacjami na temat każdego wywołania funkcji i metod, które można odczytać za pomocą specjalnego programu Konfigurujemy Xdebug 1. Pobierz rozszerzenie z oficjalnej strony xdebug.org w wersji dla używanego systemu operacyjnego dla Linuksa lub Windowsa. 2. Umieść plik.dll lub.so w folderze ext znajdującym się w katalogu instalacji PHP. 3. W pliku php.ini dodaj linijkę: zend_extension_ts('path'); 4. W miejsce PATH wpisz ścieżkę bezwzględną do pliku.dll lub.so. Dostępne są też opcje konfiguracyjne, opisane na stronie Xdebug. 5. Zapisz plik php.ini i zrestartuj Apache. Aby sprawdzić, czy rozszerzenie zostało zainstalowane prawidłowo, utwórz jakikolwiek skrypt i wywołaj funkcję phpinfo(). Jeżeli nie ma żadnej wzmianki o nim, sprawdź, czy podałeś poprawną ścieżkę (BEZWZGLĘDNĄ!) oraz czy wersja Xdebug jest zgodny z zainstalowaną wersją PHP. Czas i użycie pamięci Możesz użyć przedstawionych poniżej funkcji: //Użycie pamięci echo xdebug_memory_usage();

//Szczytowe użycie pamięci echo xdebug_peak_memory_usage(); //Czas w sekundach echo xdebug_time_index(); Instrukcje czy funkcje? Użycie instrukcji lub wyświetlenie wartości zmiennej / stałej jest kilka razy szybsze od wywołania funkcji. Na przykład wersję PHP można uzyskać na 2 sposoby. //Użycie funkcji echo phpversion(); //Wyświetlenie stałej echo PHP_VERSION; //Wersja rozszerzenia Xdebug echo phpversion('xdebug'); Od wersji PHP 5.1 uniksowy znacznik czasu (liczba sekund, która upłynęła od 11 stycznia 1970) dla momentu przyjęcia żądania znajduje się w tablicy $_SERVER. W większości sytuacji można nim zastąpić funkcję time(). echo $_SERVER['REQUEST_TIME']; Apostrof czy cudzysłów? Jeżeli w łańcuchu znaków nie używasz kombinacji: \n, \r, \t, \v, umieść go w apostrofach. W przypadku użycia cudzysłowów PHP sprawdza, czy w tekście znajdują się zmienne oraz ww. symbole, co pochłania więcej czasu. //Szybciej - bez analizy $x = 'Witaj'. $user; //Wolniej - z analizą $x = "Witaj $user"; Złączenia ciągów tekstowych Staraj się zmniejszyć ilość złączeń ciągów tekstowych (w pierwszym przykładzie - za pomocą kropki). Im jest ich więcej, tym bardziej wzrasta użycie pamięci przez skrypt, gdyż jest to dość kosztowna operacja. $user = 'Grzegorz Brzęczyszczykiewicz'; //Login $lang = 'Zalogowany jako'; //Tekst w pliku językowym echo $lang. ': '. $user; W tym przypadku zmienna $lang może już zawierać dwukropek: $lang = 'Zalogowany jako: '; echo $lang. $user; Jeszcze lepszym rozwiązaniem jest użycie instrukcji printf(). $lang = 'Zalogowany jako: %s'; //Na miejscu %s (string) pojawi się login printf($lang, $user); Aby zwrócić ciąg tekstowy zamiast wyświetlać go na ekran użyj sprintf(). Unikaj operatora @ Operator @ postawiony przed nazwą funkcji zapobiega wyświetlaniu błędów przez nią wygenerowanych. Jednak

jego użycie znacznie spowalnia skrypt. Zaleca się przemyśleć kod tak, aby pominąć operator @, a nasze rozwiązanie było jeszcze szybsze. Nie wynajduj koła na nowo Język PHP jest wciąż rozwijany. Warto dowiedzieć się, co nowego oferują nowe wersje. Być może już istnieje potrzebna Ci funkcja, którą chcesz napisać od podstaw? Funkcje wbudowane w PHP oraz w rozszerzenia są zawsze szybsze od tych, które znajdują się w interpretowanym kodzie, gdyż zostały one napisane w języku C. Nowe funkcje w PHP5 file_put_contents() zapisuje treść do pliku scandir() zwraca tablicę z listą plików i folderów w danym katalogu posortowaną alfabetycznie error_get_last() Nowe klasy w PHP5 SimpleXML i DOM (obiektowy model dokumentu) do operacji na języku XML DateTime i DateTimeZone PDO uniwersalny interfejs do obsługi baz danych MySQLi rozszerzenie obsługujące nowe możliwości MySQL (od wersji 4.1), np. podpinanie danych, transakcje... Tidy obsługuje narzędzie Tidy do analizy, czyszczenia, i naprawy dokumentów HTML Klasy Standard PHP Library Exception wyjątki, które mogą zostać rzucone instrukcją throw Zbędne zmienne Nie twórz zmiennych, których użyjesz tylko 1 raz. PHP przechowuje je w tablicy. Jeśli jest ich zbyt wiele, znalezienie szukanej zmiennej może potrwać długo. Ze względu na ilość danych użycie pamięci wzrośnie. Zasada dotyczy również stałych i funkcji. Są wyjątki od reguły. O tym w dalszej części artykułu. Oszczędź procesor Rozważ następujący przykład: setcookie('ok', 1, 60*60*24); Powyższy kod ustawia cookie na 1 dzień. Tylko po co PHP ma za każdym razem liczyć wartość wyrażenia 60*60*24? Szybszy kod:

// Ustaw cookie na 1 dzień setcookie('ok', 1, 86400); Przeanalizuj teraz poniższą pętlę FOR: // $x jest tablicą for($i=0; $i<count($x); ++$i) echo $x[$i]; PHP liczy przy każdej iteracji ilość elementów w tablicy. Jeśli w pętli nie ulega ona zmianie, policz ją tylko raz. Szybciej wykona się poniższy kod: $ile = count($x); for($i=0; $i<$ile; ++$i) echo $x[$i]; Zmienną $ile można utworzyć w pierwszym wyrażeniu pętli FOR. for($i=0, $ile=count($x)...) Jeżeli ilość elementów jest stała (np. 20), wprowadź ją od razu to drugiego wyrażenia: for($i=0, $i<20; ++$i) Programowanie obiektowe Zalążki programowania obiektowego pojawiły się już w PHP 3. Nowy model obiektowy, oferujący funkcjonalność istniejącą w wielu innych językach, został wprowadzony dopiero w PHP5. W PHP 4 obiekty są jednocześnie zmiennymi. Podczas przekazywania ich do funkcji, zwracania lub przypisywania, są one kopiowane. Aby temu zapobiec, należy przekazać obiekt przez referencje. Sytuacja uległa zmianie w PHP 5. Zmienna zawiera jedynie identyfikator obiektu, który jest kopiowany podczas ww. operacji. set, get, autoload Metody magiczne set oraz get() są uruchamiane, gdy PHP nie znajdzie własności (zmiennej), do której odwołujesz się. Nie definiuj ich, jeśli ważna jest wydajność skryptu. Następujące przykłady przedstawią przekazywanie danych do szablonu na 2 sposoby: //Z użyciem metody set() class Template protected $data; function set($name,$val) $this->name = $val; $tpl = new Template; $tpl -> title = 'Tytuł';

//Z użyciem własnej metody class Template protected $data; function set($name, $val) $this->data[$name] = $val; $tpl = new Template; $tpl->set('title', 'Tytuł'); Własności czy metody? Wywołanie metody jest 2 razy wolniejsze od wywołania zwykłej funkcji. Natomiast czas dostępu do własności obiektu jest niewiele większy niż do globalnych zmiennych (poza klasą lub funkcją). Programiści często definiują metody służące tylko do zmiany lub odczytu wartości własności obiektu, nadając większą rangę skalowalności aplikacji i hermetyzacji niż wydajności. Zastanów się jednak, czy celem takiej metody jest wcześniejsza obróbka danych, czy tylko zwrócenie lub przypisanie wartości do zmiennej obiektu. $mail -> title = 'Tytuł'; $mail -> settitle('tytuł'); Przestrzegaj typów danych Dużym ułatwieniem podczas tworzenia skryptów PHP jest to, że PHP automatycznie konwertuje typy danych. Jeżeli funkcja bądź instrukcja językowa wymaga przekazania liczby całkowitej integer, a otrzyma ciąg znaków (np. '70' zamiast 70), interpreter zamieni go na liczbę całkowitą i na odwrót. Aby uniknąć zbędnych rzutowań typów danych, staraj się tak zaprojektować aplikację, aby zminimalizować ich ilość. Aby porównać 2 wartości lub zmienne z uwzględnieniem typów danych, użyj operatora ===. if($a === $b) Operacje dyskowe Operacje dyskowe (np. dołączanie plików, skanowanie katalogów), czyli wszystkie czynności wymagające odczytu lub zapisu danych na HDD, są czasochłonne. Nie dołączaj plików bez potrzeby. Oto kilka porad: Nie dołączaj kilka razy tego samego skryptu. Jeśli dla każdego żądania skanujesz zawartość katalogu, rozważ stworzenie cache (gotowej listy). Ładuj biblioteki do pamięci tylko wtedy, gdy są potrzebne Nie dziel kodu aplikacji na zbyt wiele plików, który musi być zawsze dostępny. Include + include_path Domyślnie instrukcja include sprawdza, czy plik, który chcemy dołączyć dołączyć, nie znajduje się w którymś z katalogów wymienionych w dyrektywie include_path. Zaletą takiego rozwiązania jest to, że nie musimy podawać

ścieżki do pliku, jeśli jest w include_path. Aby PHP szukał pliku tylko w bieżącym lub określonym folderze, poprzedź ścieżkę symbolem./ //Najpierw w include_path include('plik.php'); //Tylko w bieżącym folderze include('./plik.php'); //Tylko w wyższym folderze include('../sth.php'); Powyższe uwagi dotyczą także instrukcji require, która różni się tym, że w razie niepowodzenia wyświetla błąd krytyczny i przerywa dalszą interpretację skryptu. Instrukcja switch Gdy chcesz wykonać określone akcje w zależności od wartości zmiennej, zamiast pisać kilka razy if / elseif / else, użyj instrukcji switch: $x = 5; switch($x) case 1: /* Akcja 1 */ break; case 2: case 3: /* Akcja 2 */ break; default: /* Domyślna akcja */ Zakończ każdy bloku case instrukcją break; oprócz default. Testy pod obciążeniem Zbadaj też wydajność skryptu pod większym obciążeniem serwera. Służy do tego program Apache Benchmark rozprowadzany wraz z Apache 2. Z jego pomocą dowiesz się, ile żądań serwer jest w stanie obsłużyć podczas 1 sekundy na wykorzystanym sprzęcie oraz ile trwa złożenie 1 strony. W systemie Windows znajduje się on w katalogu bin w folderze, w którym Apache został zainstalowany, np. C:\Apache2\bin\ab.exe. 1. Otwórz wiersz poleceń, wpisując cmd w oknie Uruchom. Skrót klawiszowy: WINDOWS+R. 2. Przejdź do katalogu z programem i uruchom go z opcją -h, aby wyświetlił pomoc i sposób użycia. Przykład: cd C:\Apache2\bin ab -h 3. Narzędzie pokaże listę opcji, których można użyć przy badaniu wydajności skryptu. Aby wykonać 500 żądań przy 10 jednocześnie konkurujących ze sobą, wpisz: ab -n 500 -c 10 http://localhost/strona.php

Aby zwiększyć precyzję, zakończ zbędne procesy w systemie, które wykorzystują moc procesora. Test możesz powtórzyć kilka razy. Nie ustawiaj zbyt małej ilości powtórzeń, gdyż niektóre liczby zostaną obliczone niedokładnie. Zapytania do bazy danych Zazwyczaj najwięcej czasu zajmują niezoptymalizowane lub skomplikowane zapytania do bazy danych. Staraj się zmniejszyć ich ilość. W dalszej części artykułu dowiesz się, jak zoptymalizować zapytania SQL. Indeksy Utwórz indeksy na polach, do których odwołujesz się w zapytaniu, np. po słowie WHERE lub ON. W strukturze tabeli najważniejszy jest klucz podstawowy, np. na polu ID. Załóżmy, że chcesz wyświetlić artykuł o ID=5. Wysyłasz następujące zapytanie: SELECT * FROM `articles` WHERE ID = 5; Silnik bazy danych nie musi przemierzać wszystkich rekordów. Indeksy zawierają pozycję początków wierszy, a więc dotarcie do celu jest bardzo szybkie. Pozostałe typy kluczy to: zwykłe KEY unikalne UNIQUE KEY każdy rekord musi mieć inną wartość w tym indeksie niż pozostałe obce FOREIGN KEY gdy wartość klucza w 1 tabeli zostanie zmieniona, ulegnie ona zmianie także w tabelach, które łączy ze sobą (w MySQL dostępny tylko w silniku InnoDB) pełnotekstowe FULLTEXT (MySQL: tylko w silniku MyISAM) Łączenie tabel W zapytaniach z użyciem JOIN kolumny, wg których łączysz tabele (po słowie ON), powinny zawierać indeks. W ten sposób silnik znajdzie istotne rekordy szybciej. Wyrażenie WHERE Spójrz na poniższy przykład: SELECT * FROM `tabela` WHERE `num`+10 > 100 Zakładamy, że 100 jest liczbą wejściową z PHP. Zoptymalizujmy teraz to zapytanie. Silnik SQL powinien od razu policzyć wartość wyrażenia 100-90, jednak można to zrobić w PHP, np. ($num 10). Do serwera SQL wysyłamy zaś: SELECT * FROM `tabela` WHERE `num` > 90 Wyrażenie EXPLAIN Za pomocą słowa EXPLAIN dowiesz się więcej na temat analizy zapytania przez bazę danych, np. czy klucze są wykorzystywane. W MySQL dostępne jest też słowo EXTENDED, wyświetlające szczegółowe informacje. EXPLAIN EXTENDED SELECT * FROM `articles` WHERE author = 1 AND access = 1; Predefiniowane zapytania Aby przekazać informacje do bazy danych bezpiecznie i szybko, nie narażając się na groźny atak SQL Injection,

wykorzystaj nowe możliwości serwerów bazodanowych. W omawianym przypadku są to predefiniowane zapytania (ang. `prepared statements`). W przykładzie demonstrującym zasadę ich działania wykorzystamy rozszerzenie PDO stworzone do obsługi wielu baz danych. Zakładamy, że $db jest obiektem klasy PDO. 1. Przygotuj szkielet zapytania za pomocą metody prepare(). $q = $db->prepare('update items SET title = :title, txt = :txt WHERE ID = :id'); 2. Wprowadź dane do zapytania. Możesz to zrobić na 2 sposoby za pomocą metod bindvalue() lub bindparam() (z użyciem referencji) bądź przekazując je od razu do metody execute(). $q->bindvalue('title', $_POST['title']); $q->bindvalue('txt', $_POST['text']); $q->bindvalue('id', $id, 1); $q->execute(); //Sposób 2 $data = array( 'title' => $_POST['title'], 'txt' => $_POST['text'], 'id' => (int)$id ); $q->execute($data); Jeśli za jednym razem dodajesz do bazy danych wiele pozycji, wystarczy podpiąć nowe dane do istniejącego już zapytania. W ten sposób można osiągnąć lepszą wydajność i bezpieczeństwo. W przypadku, gdy dane pochodzące z zewnątrz nie powinny zawierać kodu HTML, w szczególności wysłane przez internautów, należy użyć funkcji htmlspecialchars(). $data = array( 'title' => htmlspecialchars($_post['title']), ); Obejmij transakcją zbiór zapytań, które modyfikują dane Porada dotyczy szczególnie bazy danych SQLite oraz tabel InnoDB w MySQL. Gdy wysyłasz kilka zapytań pod rząd, które wprowadzają jakiekolwiek zmiany, np. INSERT, UPDATE, DELETE, dla każdego z nich jest tworzona osobna transakcja. Operacja może trwać długo. Aby przyspieszyć modyfikację rekordów, obejmij cały zbiór zapytań transakcją. Baza danych od razu obliczy i stworzy odpowiednią ilość miejsca dla nowych wierszy w systemie plików lub usunie wszelkie pozostałości. Dlaczego transakcje są kluczowym elementem komunikacji z bazą danych? Rozważ następujący przypadek w sklepie internetowym. Internauta kupuje produkt, lecz informacja o dokonaniu płatności nie może zostać zapisana z nieznanej przyczyny. Inny przypadek. Podczas tworzenia nowej ankiety występuje błąd przy zapisie odpowiedzi do bazy danych. Jak temu zapobiec? Jednym z najlepszych i najbezpieczniejszych rozwiązań są transakcje w połączeniu z instrukcją try catch(pdoexception $e). Przykład modyfikacji danych objętej transakcją: try //Rozpocznij transakcję $db->begintransaction();

//Zmodyfikuj dane $db->query('insert INTO tabela...'); $db->query('update tabela SET...'); //Zatwierdź zmiany $db->commit(); catch(pdoexception $e) /* Nieudana operacja */ Jeżeli oczekujesz, że inne komponenty mogą rzucić wyjątek, przechwyć podstawową klasę Exception zamiast PDOException lub złap PDOException w pierwszej kolejności. Wolno umieścić dowolną ilość instrukcji catch. UWAGA! Tabele MyISAM w MySQL nie obsługują transakcji! Nie ma znaczenia, czy zapytania zostaną objęte transakcją. Nie bój się więc używać transakcji przy tworzeniu aplikacji z obsługą wielu baz danych. Wyniki testu szybkości wstawiania 500 rekordów w SQLite: + bez transakcji: 64 sekundy + z transakcją: 0.15 sekundy GROUP BY zamiast wielu zapytań Rozważ algorytm, który liczy ilość artykułów w każdej kategorii. Można to zrobić na 2 sposoby. SELECT COUNT(*) FROM articles WHERE cat = 5 Powyższe zapytanie trzeba wysłać dla każdej kategorii, co może chwilę potrwać. Aby przyspieszyć operację, użyj instrukcji grupującej GROUP BY. Wystarczy wysłać wtedy tylko 1 zapytanie. Baza danych zwróci ilość artykułów dla poszczególnych wartości w polu `cat`. Przykład: SELECT COUNT(*) FROM articles GROUP BY cat Aby dołączyć dodatkowy warunek, umieść instrukcję WHERE przed GROUP BY: SELECT COUNT(*) AS ile FROM articles WHERE on = 1 GROUP BY cat Autor: WebCM Artykuł pobrano ze strony eioba.pl