{"id":15929,"date":"2025-12-09T12:10:03","date_gmt":"2025-12-09T11:10:03","guid":{"rendered":"https:\/\/webhosting.de\/asynchrone-php-tasks-mit-worker-queues-cronjobs-skalierung-smartrun\/"},"modified":"2025-12-09T12:10:03","modified_gmt":"2025-12-09T11:10:03","slug":"asynchroniczne-zadania-php-z-kolejkami-zadan-cronjobs-skalowanie-smartrun","status":"publish","type":"post","link":"https:\/\/webhosting.de\/pl\/asynchrone-php-tasks-mit-worker-queues-cronjobs-skalierung-smartrun\/","title":{"rendered":"Zadania asynchroniczne PHP z kolejkami zada\u0144: gdy zadania cron nie wystarczaj\u0105"},"content":{"rendered":"<p>Zadania asynchroniczne PHP rozwi\u0105zuj\u0105 typowe w\u0105skie gard\u0142a, gdy zadania cron powoduj\u0105 szczytowe obci\u0105\u017cenia, d\u0142ugi czas dzia\u0142ania i brak przejrzysto\u015bci. Poka\u017c\u0119, jak to zrobi\u0107. <strong>asynchroniczny PHP<\/strong> za pomoc\u0105 kolejek i pracownik\u00f3w odci\u0105\u017ca \u017c\u0105dania sieciowe, skaluje obci\u0105\u017cenia i \u0142agodzi awarie bez frustracji.<\/p>\n\n<h2>Punkty centralne<\/h2>\n\n<p>Na pocz\u0105tek podsumuj\u0119 najwa\u017cniejsze idee, na kt\u00f3rych opieram si\u0119 w tym artykule i kt\u00f3re stosuj\u0119 w praktyce na co dzie\u0144.<strong> Podstawy<\/strong><\/p>\n<ul>\n  <li><strong>Odsprz\u0119ganie<\/strong> \u017c\u0105dania i zadania: \u017c\u0105dania internetowe pozostaj\u0105 szybkie, zadania dzia\u0142aj\u0105 w tle.<\/li>\n  <li><strong>Skalowanie<\/strong> O pulach pracownik\u00f3w: wi\u0119cej instancji, mniej czasu oczekiwania.<\/li>\n  <li><strong>niezawodno\u015b\u0107<\/strong> przez ponowne pr\u00f3by: ponowne uruchomienie nieudanych zada\u0144.<\/li>\n  <li><strong>Przejrzysto\u015b\u0107<\/strong> Monitorowanie: d\u0142ugo\u015b\u0107 kolejki, czasy realizacji, wska\u017aniki b\u0142\u0119d\u00f3w w zasi\u0119gu wzroku.<\/li>\n  <li><strong>Separacja<\/strong> wed\u0142ug obci\u0105\u017cenia: kr\u00f3tkie, domy\u015blne, d\u0142ugie z odpowiednimi limitami.<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/php-workerqueues-2874.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Dlaczego zadania cron nie s\u0105 ju\u017c wystarczaj\u0105ce<\/h2>\n\n<p>Zadanie cron uruchamia si\u0119 \u015bci\u015ble wed\u0142ug godziny, a nie wed\u0142ug rzeczywistego czasu. <strong>Wydarzenie<\/strong>. Gdy tylko u\u017cytkownik co\u015b uruchomi, chc\u0119 natychmiast zareagowa\u0107, zamiast czeka\u0107 do nast\u0119pnej pe\u0142nej minuty. Wiele r\u00f3wnoczesnych uruchomie\u0144 cron powoduje szczytowe obci\u0105\u017cenie, kt\u00f3re na kr\u00f3tko przeci\u0105\u017ca baz\u0119 danych, procesor i operacje wej\u015bcia\/wyj\u015bcia. R\u00f3wnoleg\u0142o\u015b\u0107 pozostaje ograniczona i trudno mi jest odwzorowa\u0107 precyzyjne priorytety. Dzi\u0119ki kolejkom mog\u0119 natychmiast przesuwa\u0107 zadania do kolejki, uruchamia\u0107 kilka proces\u00f3w r\u00f3wnolegle i utrzymywa\u0107 ci\u0105g\u0142o\u015b\u0107 dzia\u0142ania interfejsu internetowego. <strong>responsywny<\/strong>. U\u017cytkownicy WordPressa mog\u0105 dodatkowo skorzysta\u0107, je\u015bli <a href=\"https:\/\/webhosting.de\/pl\/wp-cron-understand-optimise-wordpress-task-management-expert\/\">Zrozumie\u0107 WP-Cron<\/a> i chcesz skonfigurowa\u0107 go w spos\u00f3b przejrzysty, aby planowanie sterowane czasowo trafia\u0142o niezawodnie do kolejki.<\/p>\n\n<h2>Przetwarzanie asynchroniczne: kr\u00f3tkie wyja\u015bnienie poj\u0119cia \u201ejob\u2013queue\u2013worker\u201d<\/h2>\n\n<p>Kosztowne zadania umieszczam w przejrzystym <strong>Praca<\/strong>, kt\u00f3ry opisuje, co nale\u017cy zrobi\u0107, wraz z odniesieniami do danych. Zadanie to trafia do kolejki, kt\u00f3r\u0105 wykorzystuj\u0119 jako bufor na wypadek szczytowego obci\u0105\u017cenia i kt\u00f3ra obs\u0142uguje wielu konsument\u00f3w. Pracownik to trwa\u0142y proces, kt\u00f3ry odczytuje zadania z kolejki, wykonuje je i potwierdza wynik. Je\u015bli pracownik ulegnie awarii, zadanie pozostaje w kolejce i mo\u017ce zosta\u0107 przetworzone p\u00f3\u017aniej przez inn\u0105 instancj\u0119. To lu\u017ane po\u0142\u0105czenie sprawia, \u017ce aplikacja jako ca\u0142o\u015b\u0107 <strong>odporny na b\u0142\u0119dy<\/strong> i zapewnia sta\u0142y czas odpowiedzi w interfejsie u\u017cytkownika.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/phpworkerqueuesmeeting5623.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Jak dzia\u0142aj\u0105 kolejki i procesy robocze w \u015brodowisku PHP<\/h2>\n\n<p>W PHP definiuj\u0119 zadanie jako prost\u0105 klas\u0119 lub jako serializowaln\u0105 <strong>\u0142adowno\u015b\u0107<\/strong> za pomoc\u0105 modu\u0142u obs\u0142ugi. Kolejk\u0105 mo\u017ce by\u0107 tabela bazy danych, Redis, RabbitMQ, SQS lub Kafka, w zale\u017cno\u015bci od wielko\u015bci i wymaga\u0144 dotycz\u0105cych op\u00f3\u017anie\u0144. Procesy robocze dzia\u0142aj\u0105 niezale\u017cnie, cz\u0119sto jako us\u0142ugi nadzorcze, systemowe lub kontenerowe, i stale pobieraj\u0105 zadania. U\u017cywam mechanizm\u00f3w ACK\/NACK, aby wyra\u017anie sygnalizowa\u0107 pomy\u015blne i nieudane przetworzenie. Wa\u017cne jest, aby <strong>Przepustowo\u015b\u0107<\/strong> dostosowa\u0107 pracownika do oczekiwanej ilo\u015bci zada\u0144, w przeciwnym razie kolejka b\u0119dzie rosn\u0105\u0107 w niekontrolowany spos\u00f3b.<\/p>\n\n<h2>Pracownicy PHP w \u015brodowiskach hostingowych: r\u00f3wnowaga zamiast w\u0105skiego gard\u0142a<\/h2>\n\n<p>Zbyt ma\u0142a liczba proces\u00f3w PHP powoduje zatory, zbyt du\u017ca liczba proces\u00f3w obci\u0105\u017ca procesor i pami\u0119\u0107 RAM, spowalniaj\u0105c wszystko, \u0142\u0105cznie z <strong>\u017b\u0105dania internetowe<\/strong>. Planuj\u0119 liczb\u0119 pracownik\u00f3w i wsp\u00f3\u0142bie\u017cno\u015b\u0107 osobno dla ka\u017cdej kolejki, aby kr\u00f3tkie zadania nie utkn\u0119\u0142y w d\u0142ugich raportach. Ponadto ustawiam limity pami\u0119ci i regularne restarty, aby wychwyci\u0107 wycieki. Je\u015bli nie masz pewno\u015bci co do limit\u00f3w, rdzeni procesora i wsp\u00f3\u0142bie\u017cno\u015bci, przeczytaj m\u00f3j zwi\u0119z\u0142y <a href=\"https:\/\/webhosting.de\/pl\/php-workers-hosting-bottleneck-guide-balance\/\">Poradnik dotycz\u0105cy pracownik\u00f3w PHP<\/a> z typowymi strategiami r\u00f3wnowagi. Ta r\u00f3wnowaga ostatecznie zapewnia niezb\u0119dn\u0105 <strong>Mo\u017cliwo\u015b\u0107 planowania<\/strong> dla wzrostu i r\u00f3wnomiernych czas\u00f3w odpowiedzi.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/asynchrone-php-tasks-workerqueue-4287.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Limity czasu, ponowne pr\u00f3by i idempotencja: zapewnienie niezawodnego przetwarzania<\/h2>\n\n<p>Ka\u017cdej pracy przypisuj\u0119 <strong>Limit czasu<\/strong>, aby \u017caden pracownik nie by\u0142 w niesko\u0144czono\u015b\u0107 zaj\u0119ty wadliwymi zadaniami. Broker otrzymuje limit czasu widoczno\u015bci, kt\u00f3ry jest nieco wi\u0119kszy ni\u017c maksymalny czas trwania zadania, aby zadanie nie pojawi\u0142o si\u0119 dwukrotnie. Poniewa\u017c wiele system\u00f3w korzysta z dostarczania \u201eprzynajmniej raz\u201c, wdra\u017cam idempotentne procedury obs\u0142ugi: podw\u00f3jne wywo\u0142ania nie powoduj\u0105 podw\u00f3jnych wiadomo\u015bci e-mail lub p\u0142atno\u015bci. Ponowne pr\u00f3by wyposa\u017cam w funkcj\u0119 backoff, aby nie przeci\u0105\u017ca\u0107 zewn\u0119trznych interfejs\u00f3w API. W ten spos\u00f3b utrzymuj\u0119 <strong>Wska\u017anik b\u0142\u0119d\u00f3w<\/strong> niski i potrafi dok\u0142adnie zdiagnozowa\u0107 problemy.<\/p>\n\n<h2>Rozdzielanie obci\u0105\u017ce\u0144: kr\u00f3tkie, domy\u015blne i d\u0142ugie<\/h2>\n\n<p>Tworz\u0119 osobne kolejki dla zada\u0144 kr\u00f3tkich, \u015brednich i d\u0142ugich, aby eksport nie blokowa\u0142 dziesi\u0119ciu powiadomie\u0144 i <strong>U\u017cytkownik<\/strong> ka\u017cda kolejka otrzymuje w\u0142asne pule pracownik\u00f3w z odpowiednimi limitami czasu dzia\u0142ania, wsp\u00f3\u0142bie\u017cno\u015bci i pami\u0119ci. Kr\u00f3tkie zadania korzystaj\u0105 z wi\u0119kszej r\u00f3wnoleg\u0142o\u015bci i \u015bcis\u0142ych limit\u00f3w czasowych, podczas gdy d\u0142ugie procesy otrzymuj\u0105 wi\u0119cej mocy obliczeniowej procesora i d\u0142u\u017cszy czas dzia\u0142ania. Priorytety kontroluj\u0119 poprzez rozdzielenie pracownik\u00f3w mi\u0119dzy kolejki. To wyra\u017ane rozdzielenie zapewnia przewidywalno\u015b\u0107. <strong>Op\u00f3\u017anienia<\/strong> w ca\u0142ym systemie.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/phpworkerqueuesnacht4327.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Por\u00f3wnanie opcji kolejki: kiedy kt\u00f3ry system jest odpowiedni<\/h2>\n\n<p>Celowo wybieram kolejk\u0119 pod k\u0105tem op\u00f3\u017anie\u0144, trwa\u0142o\u015bci, dzia\u0142ania i \u015bcie\u017cki rozwoju, aby p\u00f3\u017aniej nie musie\u0107 ponosi\u0107 wysokich koszt\u00f3w migracji i <strong>Skalowanie<\/strong> pozostaje pod kontrol\u0105.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>System kolejki<\/th>\n      <th>U\u017cycie<\/th>\n      <th>Op\u00f3\u017anienie<\/th>\n      <th>Cechy charakterystyczne<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Baza danych (MySQL\/PostgreSQL)<\/td>\n      <td>Ma\u0142e konfiguracje, \u0142atwy start<\/td>\n      <td>\u015aredni<\/td>\n      <td>\u0141atwa obs\u0142uga, ale szybka <strong>w\u0105skie gard\u0142o<\/strong> przy du\u017cym obci\u0105\u017ceniu<\/td>\n    <\/tr>\n    <tr>\n      <td>Redis<\/td>\n      <td>Ma\u0142e i \u015brednie obci\u0105\u017cenia<\/td>\n      <td>Niski<\/td>\n      <td>Bardzo szybki w pami\u0119ci RAM, wymaga przejrzysto\u015bci <strong>Konfiguracja<\/strong> za niezawodno\u015b\u0107<\/td>\n    <\/tr>\n    <tr>\n      <td>RabbitMQ \/ Amazon SQS \/ Kafka<\/td>\n      <td>Du\u017ce, rozproszone systemy<\/td>\n      <td>Niski do \u015bredniego<\/td>\n      <td>Bogate funkcje, dobra <strong>Skalowanie<\/strong>, wi\u0119ksze koszty operacyjne<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>W\u0142a\u015bciwe wykorzystanie Redis \u2013 unikanie typowych przeszk\u00f3d<\/h2>\n\n<p>Redis wydaje si\u0119 dzia\u0142a\u0107 b\u0142yskawicznie, ale nieprawid\u0142owe ustawienia lub nieodpowiednie struktury danych prowadz\u0105 do dziwnych <strong>Czas oczekiwania<\/strong>. Zwracam uwag\u0119 na strategie AOF\/RDB, op\u00f3\u017anienia sieciowe, zbyt du\u017ce \u0142adunki i polecenia blokuj\u0105ce. Ponadto oddzielam buforowanie i obci\u0105\u017cenia kolejki, aby szczyty buforowania nie spowalnia\u0142y pobierania zada\u0144. Kompaktow\u0105 list\u0119 kontroln\u0105 b\u0142\u0119dnych konfiguracji mo\u017cna znale\u017a\u0107 w tym przewodniku. <a href=\"https:\/\/webhosting.de\/pl\/dlaczego-redis-dziala-wolniej-niz-sie-spodziewales-typowe-bledy-konfiguracji-cacheopt\/\">B\u0142\u0119dna konfiguracja Redis<\/a>. Kto dokonuje precyzyjnej regulacji, otrzymuje szybk\u0105 i niezawodn\u0105 <strong>kolejka<\/strong> do wielu zastosowa\u0144.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/phpworkerqueue6543.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Monitorowanie i skalowanie w praktyce<\/h2>\n\n<p>Mierz\u0119 d\u0142ugo\u015b\u0107 kolejki w czasie, poniewa\u017c rosn\u0105ce <strong>zaleg\u0142o\u015bci<\/strong> sygnalizuj\u0105 brak zasob\u00f3w roboczych. \u015aredni czas trwania zadania pomaga realistycznie ustawi\u0107 limity czasu i zaplanowa\u0107 wydajno\u015b\u0107. Wska\u017aniki b\u0142\u0119d\u00f3w i liczba ponownych pr\u00f3b pokazuj\u0105 mi, kiedy zewn\u0119trzne zale\u017cno\u015bci lub \u015bcie\u017cki kodu s\u0105 niestabilne. W kontenerach automatycznie skaluj\u0119 zasoby robocze na podstawie metryk procesora i kolejki, podczas gdy mniejsze konfiguracje radz\u0105 sobie z prostymi skryptami. Widoczno\u015b\u0107 pozostaje kluczowa, poniewa\u017c tylko liczby zapewniaj\u0105 solidn\u0105 podstaw\u0119 do podejmowania decyzji. <strong>Decyzje<\/strong> w\u0142\u0105czy\u0107.<\/p>\n\n<h2>Cron plus Queue: jasny podzia\u0142 r\u00f3l zamiast konkurencji<\/h2>\n\n<p>U\u017cywam Cron jako zegara, kt\u00f3ry planuje zadania sterowane czasowo, podczas gdy pracownicy wykonuj\u0105 rzeczywist\u0105 prac\u0119. <strong>Praca<\/strong> przejmuj\u0105. Dzi\u0119ki temu nie powstaj\u0105 ogromne szczyty obci\u0105\u017cenia w pe\u0142nej minucie, a spontaniczne zdarzenia s\u0105 natychmiastowo reagowane za pomoc\u0105 zada\u0144 w kolejce. Powtarzaj\u0105ce si\u0119 raporty zbiorcze planuj\u0119 za pomoc\u0105 Cron, ale ka\u017cdy szczeg\u00f3\u0142 raportu jest przetwarzany przez pracownika. W przypadku konfiguracji WordPress stosuj\u0119 si\u0119 do wytycznych zawartych w \u201e<a href=\"https:\/\/webhosting.de\/pl\/wp-cron-understand-optimise-wordpress-task-management-expert\/\">Zrozumie\u0107 WP-Cron<\/a>\u201c, aby planowanie pozosta\u0142o sp\u00f3jne. Dzi\u0119ki temu zachowuj\u0119 porz\u0105dek w harmonogramie i zapewniam sobie <strong>Elastyczno\u015b\u0107<\/strong> w wykonaniu.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/12\/php-workerqueue-setup-7482.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Nowoczesne \u015brodowiska uruchomieniowe PHP: RoadRunner i FrankenPHP w po\u0142\u0105czeniu z kolejkami<\/h2>\n\n<p>Trwa\u0142e procesy robocze oszcz\u0119dzaj\u0105 nak\u0142ady zwi\u0105zane z uruchamianiem, utrzymuj\u0105 otwarte po\u0142\u0105czenia i zmniejszaj\u0105 <strong>Op\u00f3\u017anienie<\/strong>. RoadRunner i FrankenPHP stawiaj\u0105 na d\u0142ugotrwa\u0142e procesy, pule pracownik\u00f3w i pami\u0119\u0107 wsp\u00f3\u0142dzielon\u0105, co znacznie podnosi wydajno\u015b\u0107 pod obci\u0105\u017ceniem. W po\u0142\u0105czeniu z kolejkami zachowuj\u0119 sta\u0142\u0105 przepustowo\u015b\u0107 i korzystam z ponownie wykorzystywanych zasob\u00f3w. Cz\u0119sto oddzielam obs\u0142ug\u0119 HTTP i konsument\u00f3w kolejki do osobnych pul, aby ruch internetowy i zadania w tle nie zak\u0142\u00f3ca\u0142y si\u0119 nawzajem. Kto tak pracuje, tworzy spokojn\u0105 <strong>Wydajno\u015b\u0107<\/strong> nawet przy silnych wahaniach popytu.<\/p>\n\n<h2>Bezpiecze\u0144stwo: oszcz\u0119dne i szyfrowane przetwarzanie danych<\/h2>\n\n<p>Nigdy nie umieszczam danych osobowych bezpo\u015brednio w \u0142adunku, a jedynie identyfikatory, kt\u00f3re p\u00f3\u017aniej ponownie \u0142aduj\u0119, aby <strong>Ochrona danych<\/strong> Wszystkie po\u0142\u0105czenia z brokerem s\u0105 szyfrowane, a ja korzystam z szyfrowania spoczynkowego, o ile us\u0142uga to oferuje. Producent i konsument otrzymuj\u0105 oddzielne uprawnienia z minimalnymi prawami. Regularnie zmieniam dane dost\u0119powe i nie umieszczam tajnych informacji w logach i metrykach. Takie podej\u015bcie zmniejsza powierzchni\u0119 ataku i chroni <strong>Poufno\u015b\u0107<\/strong> informacji wra\u017cliwych.<\/p>\n\n<h2>Praktyczne scenariusze zastosowa\u0144 dla Async-PHP<\/h2>\n\n<p>Nie wysy\u0142am ju\u017c e-maili w Webrequest, ale umieszczam je jako zadania, aby u\u017cytkownicy nie musieli czeka\u0107 na <strong>Wysy\u0142ka<\/strong> czeka\u0107. W przypadku przetwarzania multimedi\u00f3w przesy\u0142am zdj\u0119cia, natychmiast udzielam odpowiedzi, a miniatury generuj\u0119 p\u00f3\u017aniej, co znacznie usprawnia proces przesy\u0142ania. Raporty zawieraj\u0105ce wiele rekord\u00f3w danych uruchamiam asynchronicznie i udost\u0119pniam wyniki do pobrania, gdy tylko pracownik zako\u0144czy prac\u0119. W przypadku integracji z systemami p\u0142atno\u015bci, CRM lub marketingowymi od\u0142\u0105czam wywo\u0142ania API, aby spokojnie amortyzowa\u0107 przekroczenia limit\u00f3w czasu i sporadyczne awarie. Rozgrzewanie pami\u0119ci podr\u0119cznej i aktualizacje indeksu wyszukiwania przenosz\u0119 za kulisy, aby <strong>UI<\/strong> pozostaje szybki.<\/p>\n\n<h2>Projektowanie zada\u0144 i przep\u0142yw danych: \u0142adunki, wersjonowanie i klucze idempotencji<\/h2>\n\n<p>Staramy si\u0119, aby \u0142adunki by\u0142y jak najmniejsze i zapisujemy tylko odniesienia: jeden <strong>ID<\/strong>, typ, wersj\u0119 oraz klucz korelacji lub idempotencji. Wersja s\u0142u\u017cy do oznaczenia schematu \u0142adunku i umo\u017cliwia spokojn\u0105 dalsz\u0105 prac\u0119 nad handlerem, podczas gdy stare zadania s\u0105 nadal przetwarzane. Klucz idempotencji zapobiega powstawaniu podw\u00f3jnych efekt\u00f3w ubocznych: jest on zapisywany w pami\u0119ci danych podczas uruchomienia i por\u00f3wnywany podczas powt\u00f3rze\u0144, aby nie powsta\u0142a druga wiadomo\u015b\u0107 e-mail lub rezerwacja. W przypadku z\u0142o\u017conych zada\u0144 dziel\u0119 zadania na ma\u0142e, jasno zdefiniowane kroki (polecenia) zamiast umieszcza\u0107 ca\u0142e przep\u0142ywy pracy w jednym zadaniu \u2013 dzi\u0119ki temu mo\u017cliwe jest ponowne pr\u00f3by i obs\u0142uga b\u0142\u0119d\u00f3w. <strong>ukierunkowany<\/strong> chwyci\u0107.<\/p>\n\n<p>W przypadku aktualizacji korzystam z <strong>Wz\u00f3r skrzynki nadawczej<\/strong>: Zmiany s\u0105 zapisywane w tabeli skrzynki nadawczej w ramach transakcji bazy danych, a nast\u0119pnie publikowane przez pracownika w rzeczywistej kolejce. W ten spos\u00f3b unikam niesp\u00f3jno\u015bci mi\u0119dzy danymi aplikacji a wys\u0142anymi zadaniami i otrzymuj\u0119 solidn\u0105 \u201e<em>przynajmniej raz<\/em>\u201cDostarczanie z dok\u0142adnie okre\u015blonymi efektami ubocznymi.<\/p>\n\n<h2>Obrazy b\u0142\u0119d\u00f3w, DLQ i \u201ePoison Messages\u201c<\/h2>\n\n<p>Nie ka\u017cdy b\u0142\u0105d jest przej\u015bciowy. Dokonuj\u0119 wyra\u017anego rozr\u00f3\u017cnienia mi\u0119dzy problemami, kt\u00f3re mo\u017cna rozwi\u0105za\u0107 poprzez <strong>Pr\u00f3by<\/strong> rozwi\u0105za\u0107 (sie\u0107, limity szybko\u015bci) i b\u0142\u0119dy ko\u0144cowe (brakuj\u0105ce dane, walidacje). W przypadku tych ostatnich tworz\u0119 <strong>Kolejka martwych list\u00f3w<\/strong> (DLQ): po ograniczonej liczbie ponownych pr\u00f3b zadanie trafia tam. W DLQ zapisuj\u0119 przyczyn\u0119, fragment stacktrace, liczb\u0119 ponownych pr\u00f3b i link do odpowiednich podmiot\u00f3w. Dzi\u0119ki temu mog\u0119 podj\u0105\u0107 konkretn\u0105 decyzj\u0119: r\u0119cznie ponownie uruchomi\u0107, poprawi\u0107 dane lub naprawi\u0107 handler. \u201ePoison Messages\u201c (zadania, kt\u00f3re ulegaj\u0105 powtarzalnym awariom) rozpoznaj\u0119 po natychmiastowym niepowodzeniu startu i blokuj\u0119 je na wczesnym etapie, aby nie spowalnia\u0142y ca\u0142ej puli.<\/p>\n\n<h2>\u0141agodne wy\u0142\u0105czanie, wdra\u017canie i restartowanie<\/h2>\n\n<p>Podczas wdra\u017cania trzymam si\u0119 <strong>\u0141agodne wy\u0142\u0105czanie<\/strong>: Proces przetwarza bie\u017c\u0105ce zadania do ko\u0144ca, ale nie przyjmuje nowych. W tym celu przechwytuj\u0119 SIGTERM, ustawiam status \u201edraining\u201c i w razie potrzeby przed\u0142u\u017cam widoczno\u015b\u0107 (Visibility Timeout), aby broker nie przydzieli\u0142 zadania innemu pracownikowi. W konfiguracjach kontenerowych planuj\u0119 d\u0142ugi okres terminacji, dostosowany do maksymalnego czasu trwania zadania. Ograniczam restartowanie do ma\u0142ych partii, aby <strong>Pojemno\u015b\u0107<\/strong> nie ulegnie awarii. Dodatkowo ustawiam Heartbeats\/Healthchecks, kt\u00f3re zapewniaj\u0105, \u017ce tylko sprawne modu\u0142y robocze wykonuj\u0105 zadania.<\/p>\n\n<h2>Batching, limity szybko\u015bci i przeciwci\u015bnienie<\/h2>\n\n<p>Wiele drobnych operacji \u0142\u0105cz\u0119, je\u015bli ma to sens, w <strong>Partie<\/strong> razem: pracownik \u0142aduje 100 identyfikator\u00f3w, przetwarza je za jednym razem, zmniejszaj\u0105c w ten spos\u00f3b obci\u0105\u017cenie zwi\u0105zane z op\u00f3\u017anieniami sieciowymi i nawi\u0105zywaniem po\u0142\u0105cze\u0144. W przypadku zewn\u0119trznych interfejs\u00f3w API przestrzegam limit\u00f3w szybko\u015bci i kontroluj\u0119 mechanizmy token bucket lub leaky bucket. <strong>cz\u0119stotliwo\u015b\u0107 zapyta\u0144<\/strong>. Je\u015bli wzrasta wska\u017anik b\u0142\u0119d\u00f3w lub op\u00f3\u017anienia, pracownik automatycznie zmniejsza r\u00f3wnoleg\u0142o\u015b\u0107 (<em>adaptacyjna wsp\u00f3\u0142bie\u017cno\u015b\u0107<\/em>), a\u017c sytuacja si\u0119 ustabilizuje. Backpressure oznacza, \u017ce producenci ograniczaj\u0105 produkcj\u0119 zada\u0144, gdy d\u0142ugo\u015b\u0107 kolejki przekracza okre\u015blone warto\u015bci progowe \u2013 w ten spos\u00f3b unikam lawin, kt\u00f3re mog\u0105 przeci\u0105\u017cy\u0107 system.<\/p>\n\n<h2>Priorytety, uczciwo\u015b\u0107 i rozdzielenie klient\u00f3w<\/h2>\n\n<p>Priorytetyzacj\u0119 realizuj\u0119 nie tylko za pomoc\u0105 poszczeg\u00f3lnych kolejek priorytetowych, ale r\u00f3wnie\u017c za pomoc\u0105 <strong>wa\u017cone<\/strong> Przydzielanie pracownik\u00f3w: pula pracuje w 70% \u201eshort\u201c, w 20% \u201edefault\u201c i w 10% \u201elong\u201c, aby \u017cadna kategoria nie zosta\u0142a ca\u0142kowicie pomini\u0119ta. W konfiguracjach wielodost\u0119pnych izoluj\u0119 krytycznych klient\u00f3w za pomoc\u0105 w\u0142asnych kolejek lub dedykowanych pul pracownik\u00f3w, aby <strong>Ha\u0142a\u015bliwi s\u0105siedzi<\/strong> . W przypadku raport\u00f3w unikam sztywnych priorytet\u00f3w, kt\u00f3re powoduj\u0105 nieko\u0144cz\u0105ce si\u0119 op\u00f3\u017anienia d\u0142ugotrwa\u0142ych zada\u0144; zamiast tego planuj\u0119 przedzia\u0142y czasowe (np. w nocy) i ograniczam liczb\u0119 r\u00f3wnoleg\u0142ych zada\u0144 wymagaj\u0105cych du\u017cej mocy obliczeniowej, aby platforma mog\u0142a pracowa\u0107 w ci\u0105gu dnia. <strong>snappy<\/strong> pozostaje.<\/p>\n\n<h2>Obserwowalno\u015b\u0107: ustrukturyzowane logi, korelacja i SLO<\/h2>\n\n<p>Loguj\u0119 w spos\u00f3b uporz\u0105dkowany: identyfikator zadania, identyfikator korelacji, czas trwania, status, liczb\u0119 ponownych pr\u00f3b i wa\u017cne parametry. W ten spos\u00f3b koreluj\u0119 \u017c\u0105danie frontendu, zadanie w kolejce i histori\u0119 pracownika. Na podstawie tych danych definiuj\u0119 <strong>SLO<\/strong>: oko\u0142o 95% wszystkich zada\u0144 \u201eshort\u201c w ci\u0105gu 2 sekund, \u201edefault\u201c w ci\u0105gu 30 sekund, \u201elong\u201c w ci\u0105gu 10 minut. Alerty uruchamiaj\u0105 si\u0119 w przypadku rosn\u0105cego zaleg\u0142o\u015bci, wzrostu wska\u017anika b\u0142\u0119d\u00f3w, nietypowych czas\u00f3w dzia\u0142ania lub wzrostu DLQ. Runbooki opisuj\u0105 konkretne kroki: skalowanie, ograniczanie, ponowne uruchamianie, analiza DLQ. Tylko dzi\u0119ki jasnym wska\u017anikom mog\u0119 podejmowa\u0107 dobre decyzje. <strong>Decyzje dotycz\u0105ce wydajno\u015bci<\/strong>.<\/p>\n\n<h2>Rozw\u00f3j i testy: lokalne, powtarzalne, niezawodne<\/h2>\n\n<p>W przypadku rozwoju lokalnego stosuj\u0119 <strong>Fa\u0142szywa kolejka<\/strong> lub prawdziw\u0105 instancj\u0119 w trybie Dev i uruchamiam Worker w tle, aby logi by\u0142y natychmiast widoczne. Pisz\u0119 testy integracyjne, kt\u00f3re umieszczaj\u0105 zadanie w kolejce, wykonuj\u0105 Worker i sprawdzaj\u0105 oczekiwany wynik strony (np. zmian\u0119 w bazie danych). Symuluj\u0119 testy obci\u0105\u017ceniowe za pomoc\u0105 wygenerowanych zada\u0144 i mierz\u0119 przepustowo\u015b\u0107, 95\/99 percentyle i wska\u017aniki b\u0142\u0119d\u00f3w. Wa\u017cne jest powtarzalne zasiewanie danych i deterministyczne procedury obs\u0142ugi, aby testy pozosta\u0142y stabilne. Wycieki pami\u0119ci s\u0105 wykrywane w testach ci\u0105g\u0142ych; planuj\u0119 okresowe restartowanie i monitoruj\u0119 <strong>krzywa pami\u0119ci<\/strong>.<\/p>\n\n<h2>Zarz\u0105dzanie zasobami: procesor kontra wej\u015bcie\/wyj\u015bcie, pami\u0119\u0107 i r\u00f3wnoleg\u0142o\u015b\u0107<\/h2>\n\n<p>Rozr\u00f3\u017cniam zadania obci\u0105\u017caj\u0105ce procesor i zadania obci\u0105\u017caj\u0105ce wej\u015bcie\/wyj\u015bcie. Zadania intensywnie wykorzystuj\u0105ce procesor (np. transformacje obraz\u00f3w) wyra\u017anie ograniczam pod wzgl\u0119dem r\u00f3wnoleg\u0142o\u015bci i rezerwuj\u0119 rdzenie. Zadania obci\u0105\u017caj\u0105ce wej\u015bcie\/wyj\u015bcie (sie\u0107, baza danych) korzystaj\u0105 z wi\u0119kszej wsp\u00f3\u0142bie\u017cno\u015bci, o ile op\u00f3\u017anienia i b\u0142\u0119dy pozostaj\u0105 stabilne. W przypadku PHP stawiam na opcache, zwracam uwag\u0119 na po\u0142\u0105czenia wielokrotnego u\u017cytku (Persistent Connections) w trwa\u0142ych workerach i wyra\u017anie zwalniam obiekty na ko\u0144cu zadania, aby <strong>Fragmentacja<\/strong> . Twarde ograniczenie dla ka\u017cdego zadania (pami\u0119\u0107\/czas dzia\u0142ania) zapobiega sytuacji, w kt\u00f3rej warto\u015bci odstaj\u0105ce maj\u0105 negatywny wp\u0142yw na ca\u0142\u0105 pul\u0119.<\/p>\n\n<h2>Stopniowa migracja: od zadania cron do podej\u015bcia \u201equeue-first\u201d<\/h2>\n\n<p>Migruj\u0119 stopniowo: najpierw przenosz\u0119 niekrytyczne zadania zwi\u0105zane z poczt\u0105 elektroniczn\u0105 i powiadomieniami do kolejki. Nast\u0119pnie przetwarzanie multimedi\u00f3w i wywo\u0142ania integracyjne, kt\u00f3re cz\u0119sto powoduj\u0105 przekroczenie limitu czasu. Istniej\u0105ce zadania cron pozostaj\u0105 zegarem, ale przenosz\u0105 swoj\u0105 prac\u0119 do kolejki. W nast\u0119pnym kroku dziel\u0119 obci\u0105\u017cenia na kr\u00f3tkie\/domy\u015blne\/d\u0142ugie i konsekwentnie je mierz\u0119. Na koniec usuwam ci\u0119\u017ck\u0105 logik\u0119 cron, gdy tylko pracownicy zaczn\u0105 dzia\u0142a\u0107 stabilnie, i przechodz\u0119 na <strong>Sterowane zdarzeniami<\/strong> Punkty kolejkowania (np. \u201eU\u017cytkownik zarejestrowa\u0142 si\u0119\u201c \u2192 \u201eWy\u015blij wiadomo\u015b\u0107 powitaln\u0105\u201c). W ten spos\u00f3b zmniejsza si\u0119 ryzyko, a zesp\u00f3\u0142 i infrastruktura w kontrolowany spos\u00f3b dostosowuj\u0105 si\u0119 do nowego schematu.<\/p>\n\n<h2>Zarz\u0105dzanie i eksploatacja: zasady, limity i kontrola koszt\u00f3w<\/h2>\n\n<p>Okre\u015blam jasne zasady: maksymalny rozmiar \u0142adunku, dopuszczalny czas dzia\u0142ania, dozwolone cele zewn\u0119trzne, limity na klienta i przedzia\u0142y czasowe w ci\u0105gu dnia dla kosztownych zada\u0144. Kontroluj\u0119 koszty, skaluj\u0105c pule pracownik\u00f3w w nocy, grupuj\u0105c zadania wsadowe w godzinach poza szczytem i ustalaj\u0105c limity dla us\u0142ug w chmurze, kt\u00f3re <strong>Warto\u015bci odstaj\u0105ce<\/strong> zapobiega\u0107. W przypadku incydent\u00f3w mam przygotowan\u0105 \u015bcie\u017ck\u0119 eskalacji: alarm DLQ \u2192 analiza \u2192 poprawka lub korekta danych \u2192 kontrolowane ponowne przetwarzanie. Dzi\u0119ki tej dyscyplinie system pozostaje pod kontrol\u0105 \u2013 nawet je\u015bli si\u0119 rozrasta.<\/p>\n\n<h2>Podsumowanie: Od zadania cron do skalowalnej architektury asynchronicznej<\/h2>\n\n<p>Rozwi\u0105zuj\u0119 problemy zwi\u0105zane z wydajno\u015bci\u0105, oddzielaj\u0105c powolne zadania od odpowiedzi sieciowej i przekazuj\u0105c je za po\u015brednictwem <strong>Pracownik<\/strong> przetwarzam. Kolejki buforuj\u0105 obci\u0105\u017cenie, ustalaj\u0105 priorytety zada\u0144 i porz\u0105dkuj\u0105 ponowne pr\u00f3by i obrazy b\u0142\u0119d\u00f3w. Dzi\u0119ki oddzielnym obci\u0105\u017ceniom, czystym limitom czasu i idempotentnym handlerom system pozostaje przewidywalny. Hosting, limity pracownik\u00f3w i wyb\u00f3r brokera decyduj\u0119 na podstawie rzeczywistych wska\u017anik\u00f3w, a nie intuicji. Kto wcze\u015bnie postawi na t\u0119 architektur\u0119, otrzyma szybsze odpowiedzi, lepsze <strong>Skalowanie<\/strong> i znacznie wi\u0119kszy spok\u00f3j w codziennej pracy.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dowiedz si\u0119, w jaki spos\u00f3b asynchroniczne zadania PHP z kolejkami zada\u0144 i procesami php workers zwi\u0119kszaj\u0105 skalowalno\u015b\u0107 Twojej aplikacji oraz jak\u0105 rol\u0119 odgrywa w tym hosting.<\/p>","protected":false},"author":1,"featured_media":15922,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[922],"tags":[],"class_list":["post-15929","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technologie"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"2378","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":null,"_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"asynchrone PHP","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"15922","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/15929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/comments?post=15929"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/posts\/15929\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media\/15922"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/media?parent=15929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/categories?post=15929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/pl\/wp-json\/wp\/v2\/tags?post=15929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}