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”

Sprawdź prawdziwe obciążenie MyBB – poprawka

Jako że tworzę dodatki do MyBB i wiem, że czasami niektóre problemy trzeba rozwiązywać nieco na około, zdaję sobie sprawę z tego, czego forum MyBB wam otwarcie nie mówi. Nie wiem z czego to wynika, ale autorzy skryptu tak umieścili ostatni uchwyt dla pluginów, że to co one robią nie jest widoczne w statystykach i danych debugowania. Dla osób zainteresowanych obciążeniem ich forów może to być ważne – skrypt nie pokazuje ani prawdziwego czasu, ani użytej pamięci, ani wykonanych zapytań, no chyba że nie używacie żadnych dodatków.

Można jednak wykonać niewielką zmianę, aby dane te były widoczne. Niczym to nie grozi i jest bardzo proste. Edytujemy plik inc/functions.php

Szukamy:

zamieniamy na:

następnie szukamy:

zamieniamy na:

i to już wszystko.
Po tej prostej operacji statystyki w stopce forum będą pokazywać faktyczne dane, podobnie strony z rozpiską zapytań do bazy.
Dlaczego jest to istotne? Bo ten uchwyt wykorzystywany w zasadzie na koniec generowania forum jest bardzo przydatny w wielu sytuacjach i sporo pluginów na pewno się do niego odwołuje. Im więcej, tym bardziej zaniżone statystyki obciążenia obserwujecie bez tego zabiegu.

Mini-poprawkę, sugestię co do zmiany kolejności wysłałem już do autorów skryptu, może zechcą przesunąć kod nieco wyżej, aby administratorzy nie musieli robić tego samodzielnie.

Przeglądarka (user agent) w spisie online dla MyBB

Skrypt MyBB jest naprawdę ciekawy. Darmowy, prężnie rozwijany, posiada multum rozszerzeń, a na dodatek jest naprawdę intuicyjny. W niektórych miejscach zastanawiam się jednak, dlaczego autorzy skryptu zrobili coś tak a nie inaczej. Dzisiaj przykład tego typu. Skrypt posiada oddzielną stronę ze spisem osób będących online (włącznie z gośćmi). Wyświetla on datę ostatniej aktywności, miejsce w którym był użytkownik – np. “przegląda dział testowy” – a dla administratorów także adres IP. Tutaj jest moim zdaniem coś niewykorzystanego. MyBB w bazie danych, w tabeli od sesji trzyma informacje o przeglądarce jaką posługuje się użytkownik, zapis user agenta. Oczywiście nie jest to wartość zaufana, użytkownik może ją swobodnie modyfikować, ale jej znanie w przypadku nagłego natłoku gości może pozwolić na wyjaśnienie problemów np. wykrycie zbyt upartego robota indeksującego, który zawala nas wieloma instancjami z wielu serwerów.
Continue reading “Przeglądarka (user agent) w spisie online dla MyBB”

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:

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:

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:

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:

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.