Świetny artykuł dla początkujących osób zmagających się z optymalizacją serwisów działających na serwerach Apache2.
http://onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html
Autor zwraca uwagę na zużycie pamięci procesów apache i podaje propozycje rozwiązania problemu.
środa, 21 lipca 2010
środa, 19 sierpnia 2009
AdWords API v2009 w PHP5 - część 1
Od release nowej wersji API minęło już parę miesięcy. Dopiero niedawno miałem okazję bliżej się temu przyjrzeć i trochę pokodować.
Nowa wersja znacznie różni się od poprzednich. Wygląda na to, że będziemy mieli więcej serwisów, w każdym serwisie tylko 2 metody. Np CampaignService w wersji 13 udostępniał szereg metod:
Metoda get zastępuje w zasadzie wszystkie metody z wersji 13 zaczynające się od get.... Mutate zastępuje metody add oraz update.
Metodą get możemy pobrać zarówno dane kampanii jak i jej statystyki. Jako parametr metody podajemy CampaignSelector, w którym to możemy zdefiniować o jakie kampanie i jakie dane nam chodzi. Np wybieramy tylko kampanie o statusie "ACTIVE" albo ID mieszczącym się w zbiorze 1,2,3,4,5.
Zanim przejdziemy do przykładu, najpierw kilka rzeczy które musimy mieć aby skorzystać z API:
W moim przykładzie korzystam z rozszerzenia php5-soap.
Dane do nagłówka/autoryzacji:
Przykład zapytania - odpowiednik metody getAllAdWordsCampaigns() z wersji 13:
Nowa wersja znacznie różni się od poprzednich. Wygląda na to, że będziemy mieli więcej serwisów, w każdym serwisie tylko 2 metody. Np CampaignService w wersji 13 udostępniał szereg metod:
- addCampaign
- addCampaignList
- getCampaign
- getCampaignList
- getCampaignStats
- updateCampaign
- ...
Metoda get zastępuje w zasadzie wszystkie metody z wersji 13 zaczynające się od get.... Mutate zastępuje metody add oraz update.
Metodą get możemy pobrać zarówno dane kampanii jak i jej statystyki. Jako parametr metody podajemy CampaignSelector, w którym to możemy zdefiniować o jakie kampanie i jakie dane nam chodzi. Np wybieramy tylko kampanie o statusie "ACTIVE" albo ID mieszczącym się w zbiorze 1,2,3,4,5.
Zanim przejdziemy do przykładu, najpierw kilka rzeczy które musimy mieć aby skorzystać z API:
- Konto Google
- Auth Token (autoryzacja była inaczej rozwiązana w v13)
- Zainicjalizowane konto adwords sandbox
W moim przykładzie korzystam z rozszerzenia php5-soap.
Dane do nagłówka/autoryzacji:
$headers = array (
'authToken' => 'xxxxxxxxxxx',
'clientEmail' => 'client_1+webdevday.sandbox@gmail.com',
'userAgent' => 'webdevday',
'developerToken' => 'webdevday.sandbox@gmail.com++EUR',
'applicationToken' => 'token',
);
Inicjalizacja klienta i header:
$ns = 'https://adwords.google.com/api/adwords/cm/v200906';
$service = 'https://adwords-sandbox.google.com/api/adwords/cm/v200906/CampaignService';
$client = new SoapClient($service .'?wsdl', array('trace' => true, 'connection_timeout' => 60, 'exceptions' => 1));
$soapHeaders = array(new SOAPHeader($ns, 'RequestHeader', $headers));
Przykład zapytania - odpowiednik metody getAllAdWordsCampaigns() z wersji 13:
$selector = array('ids' => array());
$params = array('selector' => $selector);
$method = 'get';
try {
$response = $client->__soapCall($method, array($params), null, $soapHeaders);
} catch (Exception $e)
{
var_dump($e->getMessage());
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
}
var_dump($response);
Etykiety:
adwords api,
php,
soap
wtorek, 23 czerwca 2009
Postgresql i unix time (epoch)
Funkcją abstime możemy w łatwy sposób przekonwertować datę w formacie unix time (epoch). Np.
Możemy też użyć nazwy kolumny;
W drugą stronę jest trochę więcej pisania:
Przy użyciu tych funkcji możemy manipulować danymi zmieniając unix time na datę i odwrotnie. Mam nadzieję, że komuś się przyda.
Funkcje date/time dla postgresqla są na http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html
db=# select abstime(1245535200);
abstime
------------------------
2009-06-21 00:00:00+02
(1 row)
Możemy też użyć nazwy kolumny;
db=# select abstime(time), * from events;
abstime | city
-------------------------|---------
2009-06-21 00:00:00+02 | krakow
(1 row)
W drugą stronę jest trochę więcej pisania:
db=# select extract(epoch from timestamp '2009-06-21');
date_part
------------
1245535200
(1 row)
Przy użyciu tych funkcji możemy manipulować danymi zmieniając unix time na datę i odwrotnie. Mam nadzieję, że komuś się przyda.
Funkcje date/time dla postgresqla są na http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html
Etykiety:
postgresql
środa, 1 kwietnia 2009
Polak potrafi, adwords
Jak widać na poniższym obrazku, terms&conditions Google AdWords da się przeskoczyć. W każdym razie Polak potrafi.

środa, 25 lutego 2009
Staregacie.pl
Przy okazji jednej z głupkowatych rozmów na gg padło hasło zakupu domeny staregacie.pl. Po wpisaniu domeny w przeglądarkę poważnie się zdziwiłem. Oczywiście nie tym, że domena jest zajęta, spodziewałem się czegoś w rodzaju spierdalaj.pl lub jakiejś xxx strony dla fetyszów, ewentualnie sklepu z bielizną, ale to co zobaczyłem przebiło wszystko z czym miałem dotychczas do czynienia.
Spokojnie nie ma tam żadnych obrzydliwości, treści pornograficznych czy czegoś w tym rodzaju. Wręcz przeciwnie, domena przekierowuje na stronę firmy NIVEA do oferty produktów linii Energy Fresh.
No coż od dziasiaj możemy odwiedzać stronę nivea za pomocą http://staregacie.pl/
Spokojnie nie ma tam żadnych obrzydliwości, treści pornograficznych czy czegoś w tym rodzaju. Wręcz przeciwnie, domena przekierowuje na stronę firmy NIVEA do oferty produktów linii Energy Fresh.
No coż od dziasiaj możemy odwiedzać stronę nivea za pomocą http://staregacie.pl/
Etykiety:
humor
czwartek, 27 listopada 2008
Operatory post i pre-increment w PHP
Na pierwszy rzut oka prawie nie ma roznicy:
czy:
W każdym razie wynik będzie ten sam. A jednak różnica w implementacji obu operatorów jest spora. W pierwszym przykładzie użyłem operatora post-increment, który dodaje do 1 do zmiennej $i po wykonaniu lini kodu. W drugim przypadku 1 jest dodawane przed wykonaniem lini kodu.
W większości zastosowań nie ma to znaczenia, jednak przy dużej ilości takich operacji może mieć znaczący wpływ na wydajność naszej aplikacji. A co za tym idzie, zużycie czasu procesora, energii, efekt cieplarniany ;)
Dzieje się tak, ponieważ aby wykonać $i++ jest konieczne wykonanie kopii zmiennej. Czyli w efekcie mamy "dwie" zmienne $i. Jedna przechowuje poprzednią wartość a druga przechowuje wartość po dodaniu jedynki.
Zrobiłem pare testów szybkości na powyższym kodzie. Czas wykonania pętli z zastosowaniem $i++ jest o 10% większy niż wykonanie tej samej pętli z zastosowaniem ++$i.
Warto na takie sprawy zwracać uwagę, szczególnie w projektach w których przetwarzamy duże ilości danych.
W następnych postach postaram się opisać trochę więcej zagadnień związanych z wydajnością oraz optymalizacją kodu.
$i = 0;
while ($i < 1000000)
{
$i++;
}
czy:
$i = 0;
while ($i < 1000000)
{
++$i;
}
W każdym razie wynik będzie ten sam. A jednak różnica w implementacji obu operatorów jest spora. W pierwszym przykładzie użyłem operatora post-increment, który dodaje do 1 do zmiennej $i po wykonaniu lini kodu. W drugim przypadku 1 jest dodawane przed wykonaniem lini kodu.
W większości zastosowań nie ma to znaczenia, jednak przy dużej ilości takich operacji może mieć znaczący wpływ na wydajność naszej aplikacji. A co za tym idzie, zużycie czasu procesora, energii, efekt cieplarniany ;)
Dzieje się tak, ponieważ aby wykonać $i++ jest konieczne wykonanie kopii zmiennej. Czyli w efekcie mamy "dwie" zmienne $i. Jedna przechowuje poprzednią wartość a druga przechowuje wartość po dodaniu jedynki.
Zrobiłem pare testów szybkości na powyższym kodzie. Czas wykonania pętli z zastosowaniem $i++ jest o 10% większy niż wykonanie tej samej pętli z zastosowaniem ++$i.
Warto na takie sprawy zwracać uwagę, szczególnie w projektach w których przetwarzamy duże ilości danych.
W następnych postach postaram się opisać trochę więcej zagadnień związanych z wydajnością oraz optymalizacją kodu.
Etykiety:
optymalizacja,
php
poniedziałek, 3 listopada 2008
Continuous integration - Bitten
Pisanie testów (unit testów, testów funkcjonalnych, selenium) stało się integralną częścią większości projektów. Jednak uruchamianie dużej liczby testów może zajmować sporo czasu. Ponadto jeżeli nad projektem pracuje kilku programistów może pojawić się typowy problem, że u kogoś działa a u kogoś innego nie. Warto więc stworzyć środowisko testowe, na którym testy będą uruchamiane automatycznie.
Jeżeli korzystasz z Traca i Subversion możesz skorzystać z Bittena (http://bitten.edgewall.org/).
Poprzez zdefiniowane regułki Bitten aktualizuje kod w środowisku testowym (svn update), uruchomia skrypty migracji bazy, konfiguracji oraz uruchamia testy.
Procedura jest uruchamiana przy każdej zmianie kodu a raport jest dostępny poprzez Traca (http://bitten.edgewall.org/build/trunk)
Jeżeli korzystasz z Traca i Subversion możesz skorzystać z Bittena (http://bitten.edgewall.org/).
Poprzez zdefiniowane regułki Bitten aktualizuje kod w środowisku testowym (svn update), uruchomia skrypty migracji bazy, konfiguracji oraz uruchamia testy.
Procedura jest uruchamiana przy każdej zmianie kodu a raport jest dostępny poprzez Traca (http://bitten.edgewall.org/build/trunk)
Etykiety:
testowanie
Subskrybuj:
Posty (Atom)