<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP » enterv.pl</title>
	<atom:link href="https://enterv.pl/category/all/programowanie/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://enterv.pl</link>
	<description>Więcej niż tylko portfolio i blog</description>
	<lastBuildDate>Tue, 04 Mar 2025 17:27:08 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://enterv.pl/wp-content/uploads/2022/12/cropped-1024_bt-32x32.png</url>
	<title>PHP » enterv.pl</title>
	<link>https://enterv.pl</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP vs Node.js &#8211; krótki test</title>
		<link>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/</link>
					<comments>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 11:39:58 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[aplikacje webowe]]></category>
		<category><![CDATA[backend development]]></category>
		<category><![CDATA[backend development w php i node.js]]></category>
		<category><![CDATA[co szybsze]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[jaka technologia jest szybsza]]></category>
		<category><![CDATA[jakie są różnice]]></category>
		<category><![CDATA[język programowania]]></category>
		<category><![CDATA[języki programowania]]></category>
		<category><![CDATA[krótki test]]></category>
		<category><![CDATA[która technologia jest lepsza]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[node.js a php]]></category>
		<category><![CDATA[node.js czy php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[po stronie serwera]]></category>
		<category><![CDATA[porównanie]]></category>
		<category><![CDATA[porównanie dwóch technologii]]></category>
		<category><![CDATA[porównanie technologii]]></category>
		<category><![CDATA[prędkość]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie po stronie serwera]]></category>
		<category><![CDATA[server-side programming]]></category>
		<category><![CDATA[szybkość]]></category>
		<category><![CDATA[technologie]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[test prędkości]]></category>
		<category><![CDATA[test wydajności]]></category>
		<category><![CDATA[testy wydajności]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[wybór języka programowania]]></category>
		<category><![CDATA[wybór technologii]]></category>
		<category><![CDATA[wydajność]]></category>
		<category><![CDATA[zalety i wady]]></category>
		<category><![CDATA[zastosowanie]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=661</guid>

					<description><![CDATA[<p>Dzisiaj na warsztat weźmiemy sobie porównanie technologii PHP vs Nodej.js i dowiemy się, który z nich działa szybciej oraz dojdziemy do ciekawych wniosków. Serdecznie zapraszam</p>
Artykuł <a href="https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/">PHP vs Node.js – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Przygotowanie</h2>



<p>Do dzisiejszego porównania wykorzystamy PHP w wersji 8.2 oraz NodeJS w wersji 18.14.0 LTS. Użyjemy również Docker, aby ułatwić sobie konfigurowanie środowisk. Oczywiście wszystko starałem się trzymać w najbardziej defaultowej wersji jak tylko mogłem, więc nie uświadczymy tutaj żadnych dodatkowych konfiguracji, które mogłyby &#8222;podboostować&#8221; którąkolwiek technologię.</p>



<p>Dzięki lekcji, którą wyciągnąłem podczas tworzenia <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/" target="_blank" rel="noopener" title="">poprzedniego porównania</a>, dowiedziałem się, że testy muszą być jeszcze prostsze i bardziej uniwersalne i oto doszedłem do wniosku, że   najlepiej będzie zainicjować następujące sprawdziany:</p>



<ol class="wp-block-list">
<li>Obliczenie 20! czyli <a href="https://pl.wikipedia.org/wiki/Silnia" target="_blank" rel="noopener nofollow" title="">silnię</a> z 20. Oczywiście rekurencją, aby było dodatkowe obciążenie.</li>



<li>Znaleźć największą liczbę z przedziału 1-100000 &#8211; generowanie tablicy oczywiście poza mierzeniem czasu.</li>



<li>Wygenerowanie losowego ciągu znaku o długości 100000 znaków i przekształcenie wszystkich liter na wielkie litery.</li>
</ol>



<p>Zadania może nie są aż nadto trudne, ale są wystarczające, aby ukazać konkretne czasy wykonania. Ważne też jest przy każdym teście, aby wyniki były po prostu przyzwoite &#8211; to nam powie czy daną technologię w ogóle brać za poważny wybór.</p>



<h2 class="wp-block-heading">Tworzenie kodu</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg" alt="" class="wp-image-479" srcset="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-300x200.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-768x512.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1536x1024.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Na szczęście nie musiałem spędzić wielu godzin nad tym wszystkim, a i samo wyszukanie potrzebnych informacji dla obu narzędzi było bardzo przyjemne i bardzo proste. Powiem, że na tym polu mamy ładny remis. Co ciekawe, najwięcej problemów miałem z Dockerem. To nie tak, że to było uwłaczające i mega trudne, po prostu zapomniałem jak go się nastawia 😅. Także mogę powiedzieć, że taki minimalny problem był z Dockerem, no ale to nie o nim miałem pisać 😉</p>



<h2 class="wp-block-heading">Wyniki</h2>



<p>Muszę uprzedzić, że wyniki są nawet ciekawe. Żadna z technologii nie jest słaba i stanowią nadal dla siebie konkurencję. Jak dla mnie oba narzędzia dały sobie świetne radę. Liczby mówią same za siebie:</p>







<h2 class="wp-block-heading">Podsumowanie</h2>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp" alt="" class="wp-image-509" srcset="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/19362653-300x200.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/19362653-768x512.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/19362653-1536x1024.webp 1536w, https://enterv.pl/wp-content/uploads/2022/11/19362653-2048x1365.webp 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Wyniki są bliskie siebie i wydawać się może że PHP jest 2x razy szybszy od Node.js, ale czy tak jest przy większych projektach? Nie wiem, bo te testy tego nie ukazują. To co wiem, to oba narzędzia są jednak wydajne i tylko różnice technologiczne powinny decydować o tym, które narzędzie wybierzemy 🙂</p>



<p>Wszystkie testy oraz konfiguracja Docker dostępne są na <a href="https://github.com/EnterVPL/php8.2vsnode.js.18.14" target="_blank" rel="noopener nofollow" title="">GitHub</a></p>Artykuł <a href="https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/">PHP vs Node.js – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PHP vs Python &#8211; krótki test</title>
		<link>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/</link>
					<comments>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Mon, 21 Nov 2022 22:05:47 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php vs python]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[test prędkości]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=474</guid>

					<description><![CDATA[<p>Cześć moje słonie kochane 🐘 i węże tuląco-jadowite 🐍. W tym wpisie poznacie pewne różnice pomiędzy PHP, a Python oraz poznacie, co jest tak na prawdę szybsze</p>
Artykuł <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/">PHP vs Python – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć moje słonie kochane 🐘 i węże tuląco-jadowite 🐍. Nadszedł ten wiekopomny moment <s>(do którego mnie zmusiliscie)</s> do którego zostałem bardzo zachęcony, w którym napiszę o tym co jest lepsze: PHP czy Python?</p>



<p>Już na wstępie powiem, że żadne w powyższych, <strong>bo prawdziwy programista powinien umieć kontrolować wszystkimi napięciami, które powstają w komputerze tak, aby tym pisać m.in kod binarny, ale i też sterować każdym podzespołem. Wszystko inne to języki wyższych poziomów</strong> &#8211; tego pogrubionego fragmentu jak to coś nie brać na poważnie 😆</p>



<p>Więc&#8230; dzisiaj pomimo tego, że coś tutaj ukażę to niekoniecznie będzie to świadczyć o tym, który z tych języków będzie lepszy. Języki programowania są tylko różnymi narzędziami i bardzo łatwo je porównać do śrubokrętów, które powstały do konkretnych typów wkrętów (na internecie wpisać &#8222;typy śrubokrętów&#8221; to świadomość wskoczy na wyższy lvl) albo do różnych typów klejów, bo są takie do kartek, a inne są do tapet (też różne rodzaje), a jeszcze inne kleje są do drewna itd. itd&#8230; No tak samo są różne naczynia.. dobra chyba nie muszę dalej porównywać czegoś nierealnego z realnymi przedmiotami 🤣</p>



<h2 class="wp-block-heading">Przygotowanie</h2>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg" alt="" class="wp-image-479" srcset="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-300x200.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-768x512.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1536x1024.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Aby cokolwiek móc przetestować, należy wymyślić jak coś przetestować i takie punktowe cusie, np. lista rzeczy do przetestowania, ma nam też coś powiedzieć i to nie jest wcale takie proste, zatem uznałem, że nie będę robić wyrafinowanych testów lecz przetestuję jakieś rzeczy, które w obu językach da się prosto utworzyć i uruchomić.</p>



<p>Mój test polegać będzie na pobraniu z jednego źródła danych (z pliku lokanego) dokumentu w formacie JSON, a następnie sprawdzić:</p>



<ol class="wp-block-list">
<li>Prędkość parsowania JSON na Obiekt</li>



<li>Szybkość z jaką połączy się wszystkie elementy z tablicy za pomocą pętli i konkatenacji (nie będę korzystać ze specjalnych metod służących temu)</li>



<li>Szybkości serializacji JSON do obiektu klasy DTO</li>



<li>Tak jak 3. tylko że będę chciał uzyskać błąd i przetestować szybkość obsługi wyjątku</li>



<li>Prędkość deserializacji z DTO na JSON i utworzeniu nowego pliku dokumentu JSON &#8211; z tego zrezygnowałem (wyjaśnię później)</li>
</ol>



<p>Więc co nam to udowodni? Oprócz tego że będę mógł zdać relację pisania obu skryptów to i też poznamy prędkości. </p>



<p>Do testów użyję PHP 8.2 oraz Python3. Każdy punkt zrealizuję jako osobny plik, a całość wrzucę na GitHub, abyście mogli mój test powtórzyć no albo czegoś się nauczyć albo przerobić pod własne testy.</p>



<h2 class="wp-block-heading">O pisaniu skryptów</h2>



<p>W obu przypadkach googlowałem proste rzeczy, a jak to pobrać dane z pliku, a jak to przerobić na JSON, a jak to mierzyć czas wykonania kodu. No i tutaj generalnie w obu językach nie miałem aż tak większego problemu, aby cokolwiek znaleźć. Z Pythonem miałem problem taki, że kompletnie jego składni nie znam, a nawet myślałem, że skoro średników nie trzeba to tym bardziej jakiś dwukropków i &#8222;selfiaków&#8221; nie będę potrzebować, więc problemy były ze nieznajomością narzędzia. Z tego powodu musiałem zrezygnować całkowicie z piątego punktu testu.</p>



<p>Co do PHP, generalnie poza drobnymi zmianami w nazwach zmiennych to większość kodu była kopiuj wklej z internetu. Struktury w obu językach staram się zrobić identico (z drobnymi różnicami w składniach). Więc jak w PHP zrobiłem foreach to na internecie szukałem odpowiednika dla Pythona i znalazłem for in. </p>



<p>Bardzo ważne było też dla mnie to, aby skrypty w obu językach wyglądały bardzo podobnie, aby w łatwy sposób dało się porównać co z czym jak szybko działa. Pisanie kodu zacząłem wczoraj (20 list 2022) o godzinie około 20:00 co z PHP skończyłem o 20:30, co jak z Pythonem zacząłem koło 21:00 to skończyłem o 23:30 i powiedziałem, że to nie jest język na moje nerwy.</p>



<h2 class="wp-block-heading">Porównanie</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="611" src="https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1024x611.webp" alt="" class="wp-image-481" srcset="https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1024x611.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-300x179.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-768x458.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1536x917.webp 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Jako iż jestem jeszcze przed analizą wyników na wstępie mogę powiedzieć co wydaje mi się, a wydaje mi się, że Python jest dużo wolniejszy od PHP no i tak, bo w PHP można przeiterować 5-cio-milionową elementów tablicy w miej niż sekundę używając tylko bardzo prosty foreach, co w Pythonie, aby takie samo zrobić wydajniej trzeba napisać jednak więcej kodu, ale bez kombinacji w kodzie jednak chciałem robić porównanie, no bo foreach i for in to dla mnie i pewnie dla wielu to samo i w założeniu działać ma tak samo. </p>



<p>Gdy miałem przygotowany 30 MB plik z danymi to PHP poradził sobie ze wszystkim, a Python drugiego punktu testu nie potrafił dokończyć w rozsądnym czasie. Tak w sumie przerwałem mu działanie po 2 minutach. PHP poradził sobie poniżej 1 sekundy (a dokładniej to w 0,199593&#8230; sek) tworząc zmienną ze 16968000 znakami.</p>



<p>No ale chciałem jednak dać szansę wężowi, aby nie było, że specjalnie na start go uwaliłem. No chociaż myślę, że język programowania, który jest tak długo &#8222;wspierany&#8221; i uznawany jest za język wysokiego poziomu powinien mieć w miarę dojrzałą formę foreach (nawet ten for in) tak, aby zawsze szybko to działało i już na tym etapie nasuwa mi się wniosek, że to nie jest język, w którym cele biznesowe da się osiągnąć stosując strukturę heksagonalną i wszelakich zasad programowania domenowego, i jeszcze aby to działało optymalnie. Zasada jest prosta: 20 mln itemów w tablicy i chcę je przeiterować. Dla mnie według zasady <a href="https://enterv.pl/2022/08/15/programowanie-zasada-kiss/" target="_blank" rel="noopener" title="Zasada KISS">KISS</a> powinienem był użyć tylko i wyłącznie foreach.</p>



<p>Zatem.. zmniejszyłem rozmiar pliku z danymi do około 300 KB (dużo dużo mniej) i dostałem następujące wyniki</p>







<h2 class="wp-block-heading">Wnioski</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://enterv.pl/wp-content/uploads/2022/11/7720441-1024x1024.jpg" alt="" class="wp-image-484" srcset="https://enterv.pl/wp-content/uploads/2022/11/7720441-1024x1024.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/7720441-300x300.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/7720441-150x150.jpg 150w, https://enterv.pl/wp-content/uploads/2022/11/7720441-768x768.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/7720441-1536x1536.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/7720441.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Trudno tutaj jednoznacznie powiedzieć że Python jest gorszy, bo mój test tego nie dowodzi. Raz że musiałbym ten język lepiej poznać to dwa w nim tak ja ja to zrobiłem nie pisze się. To co już jednak ustaliłem, że PHP działa jednak dużo szybciej niż zakładałem 😅 W wersji 5.4 takich czasów bym już nie uzyskał, więc widzę duży postęp w optymalizacji tego języka, co pewnie skłoni mnie do porównania prędkości pomiędzy wersjami, a co bardziej, bym miał kolejny powód do aktualizowania wszystkiego 😈</p>



<p>Jeśli chodzi o jakieś dalsze wnioski idące za zdobytymi przeze mnie cyferkami to zostawię wam moje misiaczki pole do popisu, bo może jest coś, co ja mogłem przeoczyć&#8230; na pewno jest 😆</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Zatem poświęciłem dwa wieczory specjalnie pod ten pseudo-naukowy wyczyn, który zasadniczo mało co udowadnia. Za to mogłem ujrzeć wężowy odwłok odchodzący ku zachodzącemu słońcu na tle słoniowych chmur.. Czy straciłem czas?&#8230; 😬 Powiem tylko, że czas poświęconych dla moich kochanych misiaczków nigdy nie jest stracony 🫂</p>



<p class="has-small-font-size">Wolę PHP</p>



<p>Także do następnego miłego 😘</p>



<p>Repozytorium: <a href="https://github.com/EnterVPL/PHPvsPython" target="_blank" rel="noopener nofollow" title="">https://github.com/EnterVPL/PHPvsPython</a></p>Artykuł <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/">PHP vs Python – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Guzzle/Promises &#8211; wprowadzenie do biblioteki</title>
		<link>https://enterv.pl/2022/09/22/php-guzzle-promises-wprowadzenie-do-biblioteki/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Thu, 22 Sep 2022 13:22:47 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[async php]]></category>
		<category><![CDATA[asynchroniczność w php]]></category>
		<category><![CDATA[guzzle]]></category>
		<category><![CDATA[guzzle promise]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[promise php]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=402</guid>

					<description><![CDATA[<p>Wstęp Cześć kociaczki, psiaczki i miłe zwierzaczki 😀 Dzisiaj porozmawiamy sobie tak ogólnie o bibliotece do języka PHP Guzzle Promises. Pewnie część z tych co znają język JavaScript kojarzą taki twór jak Promise czyli tzw. Obietnicę. Do jej szybszej obsługi nawet wprowadzono w tym języku async i await co już na mówi po części do [&#8230;]</p>
Artykuł <a href="https://enterv.pl/2022/09/22/php-guzzle-promises-wprowadzenie-do-biblioteki/">Guzzle/Promises – wprowadzenie do biblioteki</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć kociaczki, psiaczki i miłe zwierzaczki 😀 Dzisiaj porozmawiamy sobie tak ogólnie o bibliotece do języka PHP <a rel="noreferrer noopener" href="https://github.com/guzzle/promises" target="_blank">Guzzle Promises</a>. </p>



<p>Pewnie część z tych co znają język JavaScript kojarzą taki twór jak <strong>Promise</strong> czyli tzw. Obietnicę. Do jej szybszej obsługi nawet wprowadzono w tym języku async i await co już na mówi po części do czego to służy. Tak: do asynchroniczności 😄</p>



<p>Jak wiadomo PHP nie jest językiem, który posiadałby asynchroniczność, ale to nie zraziło twórców Guzzle, która służy do obsługi requestów i pewnego dnia utworzyli oni Promises, aby można było obsłużyć asynchroniczne requesty &#8211; czyli taki PHPowy odpowiednik fetch znanego z JS. Jak się potem zaczytałem, to można ich Promise używać nie tylko do requestów, co mnie w sumie cieszy, bo dzięki temu możemy nasz kod wzbogacić o wiele ciekawszych mechanizmów.</p>



<p><strong>Quick Start</strong> został opisany na ich repozytorium GitHub w pliku <a rel="noreferrer noopener" href="https://github.com/guzzle/promises#readme" target="_blank">Readme.md</a> &#8211; ja tylko przełożę część występujących tam przykładów. </p>



<h2 class="wp-block-heading">Podstawy &#8211; przykłady</h2>



<h3 class="wp-block-heading">Utworzenie Promise</h3>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">use GuzzleHttp\Promise\Promise;

// Tworzymy nasz Promise
$promise = new Promise();

// i ustalamy co ma się wykonać
// metoda then() przyjmuje dwie funkcje
// pierwsza funkcja wykonuje się gdy nie napotkamy błędów
// druga wykona się jeśli zostaną napotkane błędy/wyjątki
$promise-&gt;then(
    // $onFulfilled
    function ($value) {
        echo 'The promise was fulfilled.';
    },
    // $onRejected
    function ($reason) {
        echo 'The promise was rejected.';
    }
);
// oba argumenty funkcji then musza być typu callable:
// @see https://www.php.net/manual/en/language.types.callable.php</code></pre>



<h3 class="wp-block-heading">Rozwiązanie Promise</h3>



<p>Aby nasz Promise cokolwiek wykonał musi zostać rozwiązany, jest to dosyć proste, bo wystarczy to zrobić:</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">use GuzzleHttp\Promise\Promise;

$promise = new Promise();
$promise
    -&gt;then(function ($value) {
        // ten then() zwróci wartość, ale nie przerwie łańcucha wywołań then()
        return "Hello, " . $value;
    })
    // jak widzisz then() zwraca nowy Promise. Ten jako $value będzie miał to co zwrócił poprzedni then()
    -&gt;then(function ($value) {
        echo $value;
    });

// Rozwiązanie Promise
$promise-&gt;resolve('reader.')
// wyświetli się "Hello, reader."</code></pre>



<p>Ok pomyślmy co tutaj się stało 🤔 Mamy jeden zadeklarowany Promise, który ma 2x then().</p>



<p>Jeśli Promise nie jest rozwiązany to każdy then() zwraca nowy Promise, dzięki czemu możemy tworzyć taki łańcuch. Dla tych co chcą bardziej wiedzieć jak ten kod działa to zapraszam na GitHub: <a rel="noreferrer noopener" href="https://github.com/guzzle/promises/blob/8e7d04f1f6450fef59366c399cfad4b9383aa30d/src/Promise.php#L31" target="_blank">https://github.com/guzzle/promises/blob/8e7d04f1f6450fef59366c399cfad4b9383aa30d/src/Promise.php#L31</a> &#8211; specjalnie dla was to znalazłem 😁</p>



<p>Więc póki nasz Promise jest w oczekiwaniu to możemy mu dokładać coraz to bardziej kolejne then(), a w nich każde kolejne callable (czyli tak w sumie callbacki), a każdy kolejny callable będzie miał jako wartość argumentu to co jest zwracane w poprzednim callable.</p>



<p>W pierwszym then() mamy funkcję zwracającą połączenie &#8222;Hello, &#8221; z podaną mu wartością. W kolejnym then() jako wartość argumentu mamy poprzednio zwróconą wartość. Z tego przykładu wiemy że to będzie w całości string (bo tak zadziała PHP w tym przypadku). Nasz drugi then() wyświetli tą wartość.</p>



<p>Więc to co się dzieje po <em>$promise-&gt;resolve(&#8217;reader.&#8217;)</em> to ten &#8222;reader.&#8221; jest przekazywany do pierwszego then(). On łączy &#8222;Hello, &#8221; z &#8222;reader.&#8221; i to jest przekazywane do kolejnego then() i on ma do wykonania wyświetlenie już wcześniej połączonego napisu co po prostu pokaże nam &#8222;Hello, reader.&#8221;</p>



<p>Proste? Tak? 😅 Wiem, że nie dla każdego to się wydaje intuicyjne, ale kilka prób i okaże się, że to banał.</p>



<h3 class="wp-block-heading">Promise Forwarding</h3>



<p>Tak do końca nie wiem jak to poprawnie na Polski przetłumaczyć, no może przekazywanie obietnic ma tutaj jakiś sens, ale nie będę szukać na siłę 😉</p>



<p>W skrócie: możemy zadeklarować kilka obietnic i je zwracać w then() dzięki temu mamy wpływ na to, kiedy i którą obietnicę będzie można wywołać. W tym prostym przykładzie poniżej wykonamy je jedna za drugą, ale nic nie stoi na przeszkodzie, aby pomiędzy rozwiązaniami wstawić jakiś inny kod.</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">use GuzzleHttp\Promise\Promise;

$promise = new Promise();
$nextPromise = new Promise();

$promise
    -&gt;then(function ($value) use ($nextPromise) {
        echo $value;
        return $nextPromise;
    })
    -&gt;then(function ($value) {
        echo $value;
    });

// Rozwiązujemy nasz pierwszy callback. Wyświetli się 'A'
$promise-&gt;resolve('A');

// tutaj może być inny kod

// Rozwiązujemy nasz drugi callback. Wyświetli się "B"
$nextPromise-&gt;resolve('B');</code></pre>



<h3 class="wp-block-heading">Synchroniczne wywołanie</h3>



<p>Czasami (tak jak czasami w JS i innych językach bywa) mamy możliwość czekania na wykonanie się obietnicy. Czy to jest przydatne? No czasami tak, ale tutaj nie będę się nad tym rozwodzić.</p>



<p>Metoda wait() domyślnie rozwiązuje nam Promise i dodatkowo zwraca nam wartość z callbacka:</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">use GuzzleHttp\Promise\Promise;

$promise = new Promise(function () use (&amp;$promise) {
    $promise-&gt;resolve('foo');
});

// metoda wait() wymusza czekanie na rozwiązanie się Promise
echo $promise-&gt;wait(); // wyświetli "foo"
// i dopiero wtedy zacznie iść do dalszej części kodu</code></pre>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Dzisiaj poznaliśmy coś co w PHP było uznawane za niemożliwe, a jednak dzięki bibliotece Guzzle/Promise niemożliwe staje się możliwe, a PHP dzięki temu staje się asynchroniczny! Oczywiście to nie jest nic nowego, bo pierwsze wzmianki, które znalazłem są z 2015 roku, w którym pojawiła się wersja <a rel="noreferrer noopener" href="https://github.com/guzzle/promises/releases/tag/0.1.0" target="_blank">0.1 tego zasobu</a>.</p>



<p>Na stan dzisiejszy jest to dość mocno rozwinięty projekt, który cieszy się coraz większym poparciem. Ja o niej dowiedziałem się stosunkowo niedawno, co mi trochę wstyd za to, no ale lepiej później niż wcale, a świat bibliotek i dokumentacji jest ogromny 😄</p>



<p>Mam nadzieję, że pomogłem tym wpisem i że więcej PHP deweloperów z tego skorzysta.  </p>



<p>Przytulam i trzymajcie się ciepło. Ciao 😊</p>Artykuł <a href="https://enterv.pl/2022/09/22/php-guzzle-promises-wprowadzenie-do-biblioteki/">Guzzle/Promises – wprowadzenie do biblioteki</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
