# Wykrywacz Martwych Linków: Dokumentacja

> Instalacja Wymagania wstępne PrestaShop 8.0 do 9.x PHP 7.4 minimum, zalecane 8.1 lub nowsze Rozszerzenie PHP cURL dla weryfikacji HTTP Rozszerzenie PHP DOM zalecane do ekstrakcji linków (fallback przez wyrażenia…

- Strona: <https://www.datafirefly.com/pl/documentation/dfbrokenlinks/>
- Język: pl
- Zaktualizowano: 2026-08-12
- Inne języki: [fr](https://www.datafirefly.com/documentation/dfbrokenlinks/index.md), [en](https://www.datafirefly.com/en/documentation/dfbrokenlinks/index.md), [es](https://www.datafirefly.com/es/documentation/dfbrokenlinks/index.md), [de](https://www.datafirefly.com/de/documentation/dfbrokenlinks/index.md), [it](https://www.datafirefly.com/it/documentation/dfbrokenlinks/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfbrokenlinks/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfbrokenlinks/index.md)
- Indeks: <https://www.datafirefly.com/pl/documentation/llms.txt>

## Instalacja

### Wymagania wstępne

- PrestaShop 8.0 do 9.x
- PHP 7.4 minimum, zalecane 8.1 lub nowsze
- Rozszerzenie PHP cURL dla weryfikacji HTTP
- Rozszerzenie PHP DOM zalecane do ekstrakcji linków (fallback przez wyrażenia regularne przejmuje pracę, jeśli go brak)

### Instalacja modułu

1. Pobierz `dfbrokenlinks.zip` ze swojego konta klienta.
2. Przejdź do **Moduły, Menedżer modułów, Wgraj moduł** i upuść ZIP. Możesz też wgrać folder `dfbrokenlinks/` do `/modules/` przez FTP.
3. Kliknij **Zainstaluj**.

Instalacja tworzy cztery tabele SQL (`ps_dfbl_scan`, `ps_dfbl_url`, `ps_dfbl_occurrence`, `ps_dfbl_ignore`) i zakładkę back-office.

### Gdzie go znaleźć

Skaner jest dostępny w **Katalog, Martwe linki i obrazy**. Strona konfiguracji modułu w menedżerze modułów wyświetla podsumowanie ostatniego skanu i przycisk prowadzący do skanera.

**Zero wpływu na front.** Moduł nie rejestruje żadnego hooka front-office. Nie modyfikuje ani szablonów, ani renderowania sklepu. Wszystko dzieje się w back-office.

## Pierwszy skan

Otwórz **Katalog, Martwe linki i obrazy** i kliknij **Uruchom nowy skan**. Ustawienia domyślne pasują do większości sklepów, dostroisz je później.

### Dwie fazy

Skan przebiega w dwóch etapach:

1. **Zbieranie.** Moduł przeszukuje zaznaczone treści, wyodrębnia każdy link i każdy obraz, deduplikuje adresy URL i sprawdza na dysku pliki graficzne, do których odwołuje się baza.
2. **Weryfikacja.** Pozostałe adresy URL są odpytywane w HTTP, kilka równolegle, aby pobrać ich kod odpowiedzi.

Przeglądarka steruje postępem kolejnymi wywołaniami. Każde wywołanie pracuje przez czas ustalony w ustawieniach (domyślnie 12 sekund), zapisuje pozycję w bazie, po czym oddaje kontrolę. To pozwala przetworzyć duży katalog bez przekraczania `max_execution_time`.

### Śledzenie postępu

Pasek postępu pokazuje bieżącą fazę. Podczas weryfikacji licznik wskazuje liczbę już przetestowanych adresów w stosunku do zebranych. Sześć wskaźników pod paskiem aktualizuje się na bieżąco.

### Zatrzymywanie i wznawianie

Przycisk **Zatrzymaj** czysto przerywa skan. Zamknięcie karty przeglądarki daje ten sam efekt, bez straty: pozycja jest zapisywana w bazie po każdej partii. Zatrzymany skan zachowuje już uzyskane wyniki, dostępne w tabeli.

**Pierwszy skan.** Uruchom go poza godzinami szczytu, zwłaszcza jeśli pozostawisz włączoną weryfikację wewnętrznych adresów URL: te żądania trafiają na Twój własny serwer.

## Ustawienia

Panel **Ustawienia skanu**, domyślnie zwinięty, otwiera się ikoną w prawym górnym rogu bloku.

### Treści do analizy

Każdy checkbox odpowiada źródłu. Źródła oznaczone plakietką _pliki_ nie generują żadnych żądań HTTP: sprawdzają obecność plików na dysku.

- **Produkty**: opis, opis skrócony, komunikaty dostępności w magazynie i przy braku
- **Kategorie**: opis oraz `additional_description`, jeśli Twoja wersja PrestaShop ma tę kolumnę
- **Strony CMS**: treść
- **Kategorie CMS**: opis
- **Marki**: opis i opis skrócony
- **Dostawcy**: opis
- **Sklepy stacjonarne**: notatka, adres linia 1 i linia 2
- **Bloki linków stopki**: własna treść modułu `ps_linklist`
- **Pliki obrazów produktów**: obecność w `img/p/`
- **Pliki obrazów kategorii, marek, dostawców, sklepów**: obecność w `img/c/`, `img/m/`, `img/su/`, `img/st/`
- **Załączniki produktów**: obecność w folderze `download/`

Źródło, którego tabela nie istnieje w Twojej instalacji, np. bloki linków przy braku `ps_linklist`, po prostu nie pojawia się na liście.

### Języki

Domyślnie analizowane są wszystkie aktywne języki. Odznaczenie języków skraca czas zbierania, ale pozostawia niesprawdzone linki w pominiętych tłumaczeniach. Przydatne do szybkiego pierwszego przebiegu, później wróć do pełnego pokrycia.

### Opcje HTTP

- **Limit oczekiwania**: maksymalny czas na pełną odpowiedź. Domyślnie 10 sekund. Powyżej URL jest liczony jako martwy z komunikatem przekroczenia czasu.
- **Limit połączenia**: maksymalny czas na nawiązanie połączenia. Domyślnie 5 sekund. Domena, której DNS już nie rozwiązuje, pada tutaj.
- **Równoległe żądania**: od 1 do 20, domyślnie 6. Zwiększenie przyspiesza skan, ale podnosi ruch wychodzący i ryzyko limitowania przez serwery zdalne.
- **Weryfikuj wewnętrzne adresy URL**: domyślnie włączone. Lokalne adresy wskazujące na statyczny plik obecny na dysku są i tak walidowane bez żądania sieciowego, więc opcja dotyczy tylko adresów przechodzących przez router PrestaShop.
- **Weryfikuj zewnętrzne adresy URL**: domyślnie włączone. Wyłączenie daje bardzo szybki skan, ograniczony do Twoich własnych treści.
- **Podążaj za przekierowaniami**: domyślnie włączone, maksymalnie pięć skoków. Kod końcowy to wtedy kod miejsca docelowego.
- **Zgłaszaj przekierowane adresy jako ostrzeżenia**: domyślnie włączone. URL odpowiadający 200 po przekierowaniu trafia jako ostrzeżenie, co pozwala wykryć linki do aktualizacji, nawet jeśli jeszcze działają.
- **Weryfikuj certyfikaty SSL**: domyślnie wyłączone. Do włączenia, jeśli chcesz wykrywać wygasłe certyfikaty, wiedząc, że niektóre źle skonfigurowane serwery wpadną wtedy w błąd.
- **Analizuj tylko elementy aktywne**: domyślnie wyłączone. Po zaznaczeniu wyłączone produkty i kategorie wypadają z zakresu.
- **User agent**: ciąg wysyłany w nagłówku. Niektóre strony odpowiadają 403 rozpoznanym robotom. Podmiana wartości na tę z nowoczesnej przeglądarki rozwiązuje sporą część tych przypadków.

### Tempo i partie

**Sekundy przetwarzania na partię** ustala czas pracy każdego wywołania. Domyślnie 12 sekund. Wartość musi pozostać wyraźnie poniżej `max_execution_time` Twojego hostingu, z zapasem bezpieczeństwa.

**Uwaga.** Jeśli hosting ogranicza skrypty do 30 sekund, nie przekraczaj 20 dla tej wartości. Moduł kończy pracę po zakończeniu trwającego żądania HTTP, nie w jego trakcie, trzeba więc zostawić zapas na ostatnią partię.

### Wykluczone adresy URL

Jeden wzorzec na linię. Trzy możliwe zapisy:

- **Zwykły tekst**: dopasowanie po podciągu. `staging.mojadomena.pl` wyklucza wszystkie adresy zawierające ten ciąg.
- **Wieloznaczniki**: `*` zastępuje dowolny ciąg znaków, `?` jeden znak. `https://*.partner.tld/*` wyklucza wszystkie subdomeny partnera.
- **Wyrażenie regularne**: prefiks `re:`. Wzorzec jest stosowany bez ograniczników.

Przykład typowej listy:

```
localhost
127.0.0.1
staging.mojadomena.pl
https://*.siec-partnerska.tld/*
re:^https://[a-z0-9-]+[.]cdn-wewnetrzny[.]net/
```

Zapis kropki dosłownej jako `[.]` w wyrażeniu regularnym pozwala uniknąć problemów z escapowaniem i jest równoważny formie z backslashem.

Wykluczone adresy pojawiają się w tabeli ze statusem _ignorowany_ i nie zużywają żadnego żądania.

## Odczyt wyników

### Sześć wskaźników

- **Znalezione URL**: liczba unikalnych adresów zebranych ze wszystkich źródeł
- **Martwe**: adresy i pliki w błędzie, wszystkie kategorie łącznie
- **Ostrzeżenia**: przypadki do przejrzenia bez pilności
- **Martwe obrazy**: wśród martwych te wykryte w tagu obrazu w treści
- **Brakujące pliki**: wśród martwych pliki nieobecne na dysku
- **Prawidłowe**: wszystko, co odpowiada poprawnie

### Statusy

- **Prawidłowy**: kod 2xx lub plik lokalny obecny na dysku
- **Ostrzeżenie**: przekierowanie, 401, 403, 429 lub URL osiągnięty po przekierowaniu, gdy odpowiednia opcja jest aktywna
- **Martwy**: 404, 410, inne 4xx, 5xx, przekroczenie czasu, błąd DNS, odmowa połączenia lub plik nieobecny na dysku
- **Ignorowany**: URL objęty wykluczeniami lub dodany do listy ignorowanych z tabeli
- **Nietestowany**: URL należący do kategorii wyłączonej w ustawieniach, wewnętrznej lub zewnętrznej

Tabela jest sortowana od najpoważniejszych, potem po liczbie użyć. Najbardziej rozpowszechnione problemy w katalogu trafiają więc na górę.

### Filtry i wyszukiwanie

Filtr statusu jest przy otwarciu ustawiony na **Tylko problemy**, co łączy martwe i ostrzeżenia. Pozostałe filtry dotyczą typu zasobu (link, obraz, plik lokalny) i źródła. Pole wyszukiwania przeszukuje jednocześnie URL i komunikat błędu, co pozwala np. wyizolować wszystkie `Connection timed out` naraz.

### Szczegóły lokalizacji

Ikona oka otwiera listę treści używających danego URL. Każda linia wskazuje:

- typ źródła (Produkty, Strony CMS, Marki...)
- nazwę elementu i jego identyfikator
- dane pole (`description`, `description_short`, `content`...)
- język
- tekst kotwicy linku lub atrybut alt dla obrazu
- przycisk **Edytuj** otwierający kartę w nowej karcie przeglądarki

URL obecny w 34 kartach produktów pojawia się w jednej linii tabeli, z 34 lokalizacjami w szczegółach. Od razu widzisz skalę problemu, zanim zaczniesz poprawiać.

## Naprawa

### Martwe linki w treści

Otwórz szczegóły, kliknij **Edytuj** przy lokalizacji do obsłużenia, popraw lub usuń link w edytorze, zapisz. Jeśli ten sam URL występuje w kilku językach tego samego produktu, każdy język jest listowany osobno: PrestaShop przechowuje treść per język, trzeba więc poprawić każdą wersję.

### Brakujące pliki obrazów

Te linie pokazują ścieżkę zamiast URL, np. `img/p/4/2/9/429.jpg`. Plik jest nieobecny, choć baza wciąż się do niego odwołuje. Trzy możliwe wyjścia:

1. Plik istnieje w kopii zapasowej: przywróć go we wskazane miejsce.
2. Obraz już nie istnieje: usuń go z zakładki Zdjęcia produktu, aby baza przestała się do niego odwoływać, potem wgraj obraz zastępczy.
3. Brakuje też miniatur: po przywróceniu lub ponownym wgraniu przegeneruj miniatury w **Wygląd, Ustawienia obrazów**.

**Formaty obrazów.** Od PrestaShop 8.1 obraz może istnieć jako JPEG, WebP lub AVIF zależnie od ustawienia `PS_IMAGE_FORMAT`. Moduł uznaje plik za obecny, gdy znaleziona jest któraś z rozszerzeń jpg, jpeg, png, webp, avif lub gif. Plik jest zgłaszany jako brakujący tylko wtedy, gdy nie istnieje żaden z tych wariantów.

### Ponowna weryfikacja URL

Ikona odświeżania ponawia weryfikację pojedynczej linii. Status i kod aktualizują się na miejscu, bez ponownego pełnego skanu. Praktyczne po poprawieniu strony u partnera lub przywróceniu pliku online.

### Ignorowanie URL

Ikona zakazu dodaje URL do listy ignorowanych. Znika z tabeli i nie będzie już zgłaszany przy kolejnych skanach. Lista ignorowanych jest przechowywana niezależnie od skanów, przetrwa więc automatyczne czyszczenie.

## Eksport CSV

Przycisk **Eksportuj do CSV** eksportuje zestaw wyników zgodnie z filtrami na ekranie. Plik używa średnika jako separatora i zaczyna się od BOM UTF-8, dzięki czemu Excel od razu poprawnie otwiera znaki diakrytyczne bez asystenta importu.

Eksportowane kolumny: URL, typ, zakres, status, kod HTTP, błąd, przekierowanie, czas odpowiedzi w milisekundach, liczba użyć, źródła, dotknięte elementy.

## Duże katalogi i wydajność

### Co kosztuje czas

Zbieranie jest szybkie: czyta bazę i parsuje HTML. Czas skanu pochodzi niemal całkowicie z weryfikacji HTTP, a dokładniej z czasu odpowiedzi serwerów zdalnych. Dwa mechanizmy ograniczają rachunek:

- **Deduplikacja.** URL obecny 400 razy jest testowany raz. W katalogu, gdzie ten sam link do tabeli rozmiarów jest skopiowany do wszystkich kart, różnica jest ogromna.
- **Walidacja lokalna.** URL z Twojej domeny wskazujący na istniejący plik statyczny jest walidowany odczytem systemu plików, bez żądania sieciowego. Obejmuje to większość obrazów w opisach.

### Sugerowane ustawienia według rozmiaru

- **Poniżej 500 produktów**: ustawienia domyślne, nic do zmiany.
- **500 do 5 000 produktów**: 6 do 8 równoległych żądań, 12 do 15 sekund na partię.
- **Ponad 5 000 produktów**: zacznij od skanu z wyłączonymi zewnętrznymi URL, aby najpierw obsłużyć własne linki i obrazy, potem uruchom pełny skan poza godzinami aktywności.

### Hosting współdzielony

Na współdzielonym obniż równoległe żądania do 2 lub 3 i zostań przy 10 sekundach na partię. Jeśli zauważysz spowolnienie frontu podczas skanu, wyłącz weryfikację wewnętrznych URL: lokalne pliki statyczne pozostają kontrolowane na dysku, tracisz tylko test adresów przechodzących przez router.

## Multistore

Zakres skanu podąża za kontekstem sklepu wybranym w górnym pasku back-office. Tabele z kolumną identyfikatora sklepu, jak `ps_product_lang` czy `ps_category_lang`, są odpowiednio filtrowane. Aby objąć sieć trzech sklepów, uruchom trzy skany, zmieniając kontekst między nimi.

## Rozwiązywanie problemów

### Skan tkwi w fazie zbierania

Zbieranie nie pokazuje szczegółowego licznika, może więc wyglądać na zawieszone na bardzo dużym katalogu, choć postępuje. Sprawdź zakładkę sieciową przeglądarki: wywołania powinny następować co około dwanaście sekund. Jeśli wywołanie zwraca błąd 500, zmniejsz czas przetwarzania na partię i uruchom ponownie.

### Dużo 403 na linkach działających w przeglądarce

Cloudflare i ochrony anty-bot blokują żądania nierozpoznane jako przeglądarka. Podmień user agent na ten z nowszego Chrome'a lub Firefoksa. Jeśli domena pozostaje zablokowana, dodaj ją do wykluczeń: to nie jest martwy link, tylko link nieweryfikowalny ze skryptu.

### Błąd SSL certificate problem

Certyfikat zdalnej strony nie jest walidowany przez magazyn certyfikatów Twojego serwera. Jeśli nie potrzebujesz kontroli certyfikatów, odznacz **Weryfikuj certyfikaty SSL**. Jeśli komunikat dotyczy Twojej własnej domeny, to realny problem do rozwiązania po stronie serwera.

### Wszystkie wewnętrzne URL wpadają w błąd

Twój serwer nie potrafi wywołać sam siebie, częsty przypadek za reverse proxy lub przy nietypowym wewnętrznym DNS. Odznacz **Weryfikuj wewnętrzne adresy URL**. Brakujące pliki obrazów i linki zewnętrzne pozostają wykrywane normalnie.

### Obrazy zgłaszane jako brakujące, choć się wyświetlają

Sprawdź ścieżkę wskazaną w tabeli. Jeśli plik faktycznie istnieje w tym miejscu, przyczyną jest niemal zawsze restrykcja odczytu PHP: skontroluj uprawnienia folderu `img/` i dyrektywę `open_basedir`.

### Baner sygnalizuje brak cURL

Rozszerzenie PHP cURL nie jest zainstalowane na Twoim hostingu. Poproś hostingodawcę o aktywację. W międzyczasie moduł pozostaje użyteczny do brakujących na dysku plików obrazów, które nie przechodzą przez sieć.

## Referencja techniczna

### Tabele SQL

- `ps_dfbl_scan`: jeden rekord na skan, z fazą, pozycją wznawiania i licznikami
- `ps_dfbl_url`: unikalne adresy URL skanu, z odciskiem, statusem i wynikiem HTTP
- `ps_dfbl_occurrence`: lokalizacje, powiązane z URL i treścią katalogu
- `ps_dfbl_ignore`: lista ignorowanych, niezależna od skanów

Przechowywane są tylko trzy ostatnie skany. Przy uruchomieniu nowego najstarsze są usuwane wraz ze swoimi adresami i lokalizacjami.

### Wyodrębniane atrybuty

Moduł czyta następujące atrybuty w HTML Twoich treści:

- tag a: `href`
- tag area: `href`
- tag img: `src`, `data-src`, `data-original`, `data-lazy`, `srcset`
- tagi source i video: `src`, `srcset`, `poster`
- tagi audio, iframe, embed: `src`
- tag object: `data`
- tagi link i script: `href`, `src`
- atrybut `style`: deklaracje `background-image: url(...)`

Przed jakąkolwiek weryfikacją odrzucane są: `mailto:`, `tel:`, `sms:`, `callto:`, `javascript:`, data URI, same kotwice, schematy inne niż HTTP i HTTPS oraz każda wartość zawierająca klamry lub nawiasy kwadratowe, sygnalizujące pozostałość Smarty lub shortcode'u.

Względne adresy URL są rozwiązywane względem bazowego URL sklepu, z poszanowaniem segmentów `.` i `..`. Adresy bez protokołu zaczynające się od dwóch ukośników dziedziczą schemat sklepu. Fragment po kratce jest usuwany przed żądaniem.

### Kontroler i architektura

Jeden kontroler administracyjny, `AdminDfBrokenLinks`, udostępnia stronę i punkty wejścia AJAX. Moduł nie deklaruje żadnego hooka. Klasy są ładowane przez bezpośrednie include, bez Composera i zależności zewnętrznych.

## Odinstalowanie

Z menedżera modułów odinstaluj **Broken Links & Images Checker**. Cztery tabele, zakładka back-office i wszystkie klucze konfiguracji są usuwane.

**Lista ignorowanych znika razem z modułem.** Tabela `ps_dfbl_ignore` jest usuwana przy odinstalowaniu. Jeśli zbudowałeś długą listę ręcznych wykluczeń, wyeksportuj ją lub skopiuj pole wykluczonych adresów przed odinstalowaniem.

## FAQ

### Czy moduł modyfikuje moje treści?

Nie. Czyta treści i pisze wyłącznie we własnych tabelach. Wszystkie korekty przechodzą przez standardowy back-office PrestaShop.

### Czy mogę zaplanować automatyczny skan?

Wersja 1.0.0 uruchamia skany z back-office, z przeglądarką jako dyrygentem. Nie ma zadania cron. W praktyce comiesięczny skan uruchamiany ręcznie wystarcza dla większości katalogów.

### Dlaczego URL pojawia się jako ostrzeżenie, choć odpowiada 200?

Bo został osiągnięty po przekierowaniu, a opcja **Zgłaszaj przekierowane adresy jako ostrzeżenia** jest aktywna. Link działa, ale zmusza odwiedzających i Google do zbędnego skoku. Lepiej wstawić w treść bezpośrednio docelowy URL.

### Czy moduł wykrywa linki w modułach zewnętrznych?

Analizuje treści przechowywane w standardowych tabelach PrestaShop i bloki linków `ps_linklist`. Moduł zewnętrzny przechowujący własne teksty we własnych tabelach nie jest objęty.

### Czy skany zużywają przepustowość?

Każda weryfikacja zaczyna się od żądania HEAD, które pobiera tylko nagłówki. Fallback na GET, używany gdy serwer zdalny odmawia HEAD, ogranicza pobieranie do pierwszych dwóch kilobajtów. Wolumen pozostaje marginalny.

### Ile skanów jest przechowywanych?

Trzy ostatnie. To pozwala porównać stan przed i po korekcie, nie pozwalając bazie rosnąć w nieskończoność.

### Czy moduł jest zgodny z RODO?

Nie przechowuje żadnych danych osobowych: wyłącznie adresy URL, kody HTTP i odniesienia do Twoich treści. Żadne dane nie są przesyłane do DataFirefly.
