PHP – proste sprawdzanie dostępności witryny

Dzisiaj dosyć szybki wpis, może po prostu komuś przyda się niewielki skrypt w PHP jaki napisałem jakiś czas temu na własne potrzeby. Jego zadaniem jest po prostu sprawdzanie dostępności witryny. Nie robi nic specjalnego, bo po prostu sprawdza kod odpowiedzi na żądanie do serwera przy użyciu cURLa. Jeżeli nie jest równy 200, czyli oznaczający że wszystko gra, to wysyła na podany adres wiadomość email o padzie. Gdy serwis wróci do życia, wyśle drugi email z informacją, jak długo trwał czas niedostępności. Jak można się domyślić, skrypt korzysta z crona i najlepiej właśnie z niego go odpalać. Dlaczego w ogóle w PHP? A dlaczego nie?

Continue reading “PHP – proste sprawdzanie dostępności witryny”

LNMP – Część 1: Wstęp i repozytoria

Jakiś czas temu na łamach bloga pojawiła się seria wpisów okoko w której poruszał on niektóre aspekty sieci czy serwerów www. Na podstawie swoich doświadczeń miałem kilka zastrzeżeń w artykule dotyczącym nginx, zapowiedziałem wtedy swój artykuł. Czas leci do przodu, a wpisu cały czas nie ma. Nie będę oszukiwał, po prostu nie było. Pozwoliło mi to jednak na przemyślenie sprawy i ostatecznie zmianę koncepcji. Postanowiłem, że zamiast jednego wpisu pojawi się cała seria dotycząc konfiguracji LNMP – od Linux + Nginx + MySQL + PHP. Sądzę, że taka seria pozwoli innym zapoznać się w tym bardziej przystępny sposób, liczę też na to, że dzięki waszym komentarzom sam dowiem się czegoś nowego ;) Z góry zaznaczam, że może być nieregularnie, bo równie bywa z czasem.

Continue reading “LNMP – Część 1: Wstęp i repozytoria”

Suma kontrolna pliku w PHP na przykładzie md5

W ostatnim czasie tworzyłem skrypt, który musiał badać sumy kontrolne plików i porównywać je z gotową listą – po prostu weryfikacja, czy pliki są oby na pewno w porządku, z użyciem hashy md5. Wszystko byłoby bardzo proste, gdyby nie fakt, że pliki bywały dosyć spore (nawet ponad 250 MB), a nie miałem żadnego wpływu na ustawienia z php.ini. Dlaczego o tym wspominam? Ano dlatego, że pierwsze co przyszło na myśl to użycie funkcji md5_file. W sieci można znaleźć również inne specyficzne rozwiązanie tj. wczytanie zawartości pliku, a następnie obliczenie przy pomocy funkcji md5() hasha dla tych danych:

$checksum = md5(file_get_contents($filename));

Niestety przy sporych plikach momentalnie przekraczamy limit zajętej pamięci, bo przecież ich zawartość leci właśnie tam. Takie rozwiązanie odpada. Lepszym wydawało się użycie wspomnianej funkcji md5_file, która pamięci nam tak nie zawala:

$checksum = md5_file($filename);

To niestety również nie było satysfakcjonującym wynikiem, bo o ile skrypt nie przekraczał limitu pamięci, o tyle często nie był w stanie wyrobić się z obliczeniem sumy w czasie jaki miał do dyspozycji (np. 60 sekund). Po prostu obliczenie sumy md5 za pośrednictwem PHP było za wolne. Kolejne rozwiązanie – sięgnięcie do shella:

$result = explode('= ',exec("openssl md5 $filename"));
$checksum = $result[1];

W tym wypadku obliczanie sumy kontrolnej trwało… ponad 3-4 razy krócej! Było to już więc całkiem niezłe rozwiązanie, oczywiście do pewnego rozmiaru. Okazało się jednak, że istnieje jeszcze szybsza metoda, skracająca ten czas jeszcze dwukrotnie, czasami nawet więcej. Zamiast używać openssl md5, można od razu użyć md5sum, dodatkowo z parametrem “b” tj. czytanie w trybie binarnym. Na koniec przedstawiam więc metodę, która w moim wypadku okazała się najszybsza, dodatkowo jest ona “skompletowana” poprzez przefiltrowanie zmiennej która idzie do funkcji shell_exec:

$result = explode(' ', exec('md5sum -b ' . escapeshellarg($filename)));
$checksum = $result[0];

Warto zwrócić uwagę na różnicę w pierwszym argumencie dla explode oraz sam dostęp do elementu tablicy z sumą kontrolną – oba polecenia zwracają dane w nieco inny sposób (oraz kolejności). To by by było na tyle. Dlaczego nie SHA albo CRC? Pierwszy z nich okazał się sporo wolniejszy, drugi nie odbiegał od md5 ale zwracał sumy w formacie dwuczłonowym, a mi zależało na jak najszybszym i najkrótszym otrzymaniu sum kontrolnych. Jeżeli znacie metody lepsze / szybsze, lub też gdzieś popełniłem błąd, poprawcie mnie.

Generator haseł – metodologia wyboru z zestawów

Dosyć często używam generatorów haseł. Jakoś nie mam talentu ani sposobu na wymyślanie jakichś finezyjnych, więc polegam na losowo wygenerowanych ciągach zawierających różne zestawy danych. Tradycyjnie takimi zestawami są np: małe litery, duże litery, cyfry, znaki interpunkcyjne oraz inne znaki specjalne. Używając kilku z narzędzi do generowania haseł dostępnych z poziomu www zauważyłem pewną “prawidłowość” – losowanie najprawdopodobniej wykonywane jest na sumie wybranych zbiorów. Przedstawienie bardziej-po-ludzku: załóżmy, że chcemy hasło 9 znakowe, zawierające duże/małe litery oraz cyfry. Przy wielokrotnym generowaniu hasła zauważamy, że cyfry występują nad wyraz rzadko. Często mają miejsce sytuacje, gdy nie jest wylosowana żadna, albo tylko jedna. Czasami trafiają się dwie, zaś większa ilość to istna egzotyka. Statystycznie średnio powinny być jednak 3 cyfry, bo mamy do dyspozycji 3 zbiory i 9 miejsc do wypełnienia. Tak się jednak nie dzieje…
Continue reading “Generator haseł – metodologia wyboru z zestawów”

MySQL i sortowanie z polskimi znakami

Dzisiaj podczas wysyłania próśb do autorów zaprzyjaźnionych blogów dotyczących zmiany anchora mojego linku natrafiłem (a raczej natrafiliśmy razem z Marcinem Łuniewskim) na problem natury technicznej. Otóż okazało się, że WordPress tak pięknie obecnie wspierający UTF8 i domyślnie korzystający z takiego właśnie kodowania znaków, nie sortuje wcale umieszczonych linków alfabetycznie, choć o takim sposobie nas informuje. Linki zawierające na początku polskie znaki zostają umieszczone na samym końcu, co też oznacza, że “wyrzuca” je poza znany mu alfabet. Skoro wszystko jest kodowane w UTF8 to sprawa wydawała się bardzo dziwna, dopóki nie przyjrzałem się strukturze tabeli oraz samej bazy WP – domyślna metoda porównywania napisów to utf8_general_ci, a niestety okazuje się, że general wcale nie oznacza wszystkie, a poza tym właśnie w collocation zawarte są dane dotyczące alfabetu używanego do sortowania. Zgodnie z przewidywaniami, zmiana metody chociażby na tylko jednym polu od nazwy na utf8_polish_ci problem zupełnie rozwiązała. Dobrze będzie wiedzieć na przyszłość, ponieważ takie sortowania wykonuje się jednak dosyć często, a dane na polskich stronach mogą przecież zawierać nasze znaki narodowe.