Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: matipl, dodany: 06.09.2023 15:17, tagi: php

Jeszcze raz – ogromne podziękowania dla Organizatorów za 2022 rok. Reaktywacja PHPCon Poland udała się w 100% i bardzo się cieszę, że przed nami edycja 2023.

PHPCon Poland to konferencja sięgająca roku 2010, kiedy miejscem spotkania był Jodłowy Dwór w Szklanej Hucie (tuż obok Świętego Krzyża). Były to piękne czasy, kiedy organizacją konferencji zajmował się jeszcze PLUG (koszt udziału wtedy był podzielony na 3 składowe – zakwaterowanie, akredytacja i obiad niedzielny). Co to była za konferencja – BoBsoN, Zyx, eRIZ czy Piotr Macuk wśród prelegentów. Wtedy programiści skupieni byli głównie na optymalizacji i nowościach (memcached, cachowanie danych, SOAP, git). Sama konferencja zaczynała się w piątek po 16:00, a kończyła obiadem o 13:00 w niedzielę.

Jakby ktoś z Was chciał wrócić do tamtych wspomnień, sprzed 13 lat, zapraszam na Flickr – PHPCon Poland 2010. To wszystko było, minęło, już nie wróci. Życie. Świat niesamowicie się zmienił przez te lata, ale PHPCon Poland po przerwie prawie wrócił do źródeł.

PHPCon Poland 2022

Tym razem nie było 250 osób, ale 600. Jesień zamiast wiosny. Tylko jeden dzień, zamiast trzech. Hotel inny, część Polski również. Ale atmosfera została taka sama… A do tego spora dawka wiedzy. Było świetnie.

Przed nami edycja 2023. Znów mamy możliwość spotkania się w Zawierciu, niedaleko autostrad A1 i A4. A do tego kilka kroków od hotelu Villa Verde jest stacja kolejowa (Zawiercie Borowe Pole). Tym razem konferencja zacznie już się w piątek popołudniem, a zakończy integracją późnym sobotnim wieczorem. Coraz bardziej wracamy do korzeni.

Jest już podana lista prelekcji (z ciekawymi kąskami) oraz są dostępne bilety (720 zł za sobotę, lub 2 dni za 1350 zł). Jeśli ktoś nie lubi płacić w ciemno to nie musi.

Autor wpisu: matipl, dodany: 26.04.2021 15:56, tagi: internet, php

W zasadzie większość z nas ma stały adres IP, najczęściej zmienia się tylko w przypadku gdy nasz router ponownie nawiązuje połączenie z usługodawcą (ISP). W takiej sytuacji, np. w warunkach domowych, aż pragnie się wystawić na świat np. album zdjęć lub inne rzeczy, których nie chcemy umieszczać bezpośrednio na serwerach firm trzecich (w tzw. chmurze). Tylko jak przekazać link innym? Przecież za każdym razem nie będziemy podawać czegoś w stylu http://125.130.125.2. Po pierwsze ponieważ jutro możemy mieć już inny publiczny adres IP nadany przez ISP (np. modem się zrestartował), a po drugie łatwiej zapamiętać http://home.domena.pl .

DDNS – zewnętrzni usługodawcy

Skonfigurowanie subodmeny to rzecz prosta. Pozostaje inna kwestia – jak zautomatyzować proces, aby adres home.domena.pl zawsze kierował na naszą domową maszynę? Nic prostszego – możemy wykorzystać DDNS / DynDNS / dynamiczny DNS. Proces polega na tym, że wydzielamy z naszej domena.pl subdomenę, która ma inny TTL (czas odświeżania) i zarządzamy samą domeną oddzielnie (co też umożliwia lepszą kontrolę pod względem bezpieczeństwa). Możemy wykorzystać darmowe serwisy oferujące usługę DDNS, gdzie dostaniemy subdomenę w ramach ich domeny. Z naszej strony pozostaje ustawić cykliczną operację (cron) na wysłanie zapytania do API celem aktualizacji wpisu DNS dla subdomeny.

Taką usługę oferuje chociażby FreeDNS. Rejestracja jest bardzo prosta, po wszystkim pozostaje nam wywołanie przekazanego URI z tokenem naszej subdomeny w naszej sieci lokalnej (router/serwer/etc):

[~] $ curl https://sync.afraid.org/u/CyTXMbtq5cPnLjEg5vKHTPDE/
Updated demo.freshdns.com from 107.170.238.X to 50.23.197.94

Jeśli posiadacie własną domenę i korzystacie z gotowego panelu do zarządzania domeną to często jest możliwość skonfigurowania bezpośrednio tam DDNS. Taką usługę oferuje chociażby OVH.

DDNS – własne rozwiązanie

Ale może niektórzy z Was lubią posiadać większą kontrolę nad domeną (specyficzne rekordy) niż oferuje firma, w której opłacacie domenę. Posiadacie np. własną instancję BIND, gdzie trzymacie kilka domen (prostą konfigurację BIND opisałem w 2010 roku) i chcielibyście wykorzystać ten serwer nazw do DDNS. Sam tak właśnie pomyślałem, gdy okazało się, że na jednym z interfejsów zewn. posiadam dość zmienną adresację.

DDNS – modyfikacja w BIND

Zacznijmy od zmiany w samym BIND. Powiedzmy, że posiadamy domenę domena.pl i jej strefa u nas wygląda następująco:

$TTL 86400
$ORIGIN domena.pl.
@ IN SOA dns1.domena.pl. root.domena.pl. (
        2010111801 ;; serial
        2H         ;; refresh
        1H         ;; retry
        7D         ;; expire
        1D         ;; TTL
        )
@               IN      NS      dns1.domena.pl.
@               IN      NS      dns2.domena.pl.

@               IN      MX      10 mail.domena.pl.

@               IN      A       XXX.XX.XX.X
dns1            IN      A       XXX.XX.XX.X
dns2            IN      A       YYY.YY.YY.Y

www             IN      CNAME   @
mail            IN      CNAME   @
ftp             IN      CNAME   www

I gdy chemy dodać dodać naszą domową/lokalną subdomenę tworzymy dodatkową pozycją:

home            IN      A       ZZZ.ZZ.ZZ.Z

Ale w naszym przypadku dodajemy home.domena.pl z informacją, że jest zarządzana osobno:

home            IN      NS      dns1.domena.pl.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Wojciech Sznapka, dodany: 01.11.2020 23:10, tagi: php

Every API fails at random points of time and that’s unavoidable. Sadly, it’s not taken care correctly during integrating third party API’s. I see it very often. „Hey there! But I’m using try-catch and handle errors, sometimes even I log them to the file…” one might say. Well, so what? What happens when it fails and you miss data which needed to be fetched during the daily ETL process? Or your business partner misses information if you send data to their API and for some reason, it fails. What then? As long as you use cron and have output emailed to some mailbox, which is being monitored – you’ll notice. Maybe you use Sentry or any other application monitoring/error tracking software and you’ll spot some anomaly. But imagine having dozens of such jobs running on a daily basis – it’s easy to lose track.

I think you get my point now. API errors occur quite often. Most of them are due to temporary service unavailability, caused mainly by having too much traffic at the moment. The simple solution is to retry. In this post, I’ll show how to easily implement efficient retry mechanism.

According to Wikipedia

Exponential backoff is an algorithm that uses feedback to multiplicatively decrease the rate of some process, in order to gradually find an acceptable rate.

In case, which I’ll explore, it’s a way to retry a piece of code, in case of an exception occurrence. It will delay every attempt with exponential pause, according to the equation (2^attempt) * baseTime

Below example uses PHP’s backoff library. Similar libs can be found in Python, node.js and probably any language of choice.

use GuzzleHttp\Exception\RequestException;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Processor\UidProcessor;
use STS\Backoff\Backoff; # nothing to do with sts.pl ;)

$log = new Logger('x');
$log->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));
$log->pushProcessor(new UidProcessor());

$client = new GuzzleHttp\Client();
// below API fails 60% of time
// always fail first call in 5 minutes timespan
$url = 'https://sznapka.pl/fakeapi.php';
$log->debug(sprintf('Fetching from %s', $url));

$backoff = new Backoff(10, 'exponential', 10000, true);
$result = $backoff->run(function() use ($client, $url, $log) {
    try {
        $res = $client->request('GET', $url);
        $data = json_decode($res->getBody(), true);
        $log->info(sprintf('Got response, %d items', count($data)));
    } catch (RequestException $e) {
        $log->error($e->getResponse()->getBody());
        throw $e; // causes backoff lib to retry
    }
});
$log->debug('All done');

When you run it with php ./console.php you’ll get:

[22:29:15.649] x.DEBUG: Fetching from https://sznapka.pl/fakeapi.php [] {"uid":"6b3d944"}
[22:29:15.759] x.ERROR: API failed, what a surprise! [] {"uid":"6b3d944"}
[22:29:15.832] x.ERROR: API failed, what a surprise! [] {"uid":"6b3d944"}
[22:29:16.268] x.INFO: Got response, 5 rows [] {"uid":"6b3d944"}
[22:29:16.269] x.DEBUG: All done [] {"uid":"6b3d944"}




As you can see, the backoff library retries with exponential intervals until our wrapped closure doesn’t throw an exception. It has set 10 retries and waitCap 10 seconds, so will stop processing whenever one of those conditions appear. I’ve also defined jitter parameter to true to spread out retries and minimize collisions.

Last but not least – always log your external API usage. It will help you a lot during the debugging phase. Also, it’s very handy to use UidProcessor which puts an uid (per session) into logger’s context. It allows filtering logs from given invocation, which is especially helpful with overlapping calls or concurrent usage.

Autor wpisu: Wojciech Sznapka, dodany: 24.09.2020 21:26, tagi: php

Apache Kafka has became an obvious choice and industry standard for data streaming. When streaming large amounts of data it’s often reasonable to use AVRO format, which has at least three advantages:

  • it’s one of most size efficient (compared to JSON, protobuf, or parquet); AVRO serialized payload can be 10 times smaller than the JSON equivalent,
  • enforces usage of a schema,
  • works out of the box with Kafka Connect (it’s a requirement if you’d like to use BigQuery sink connector).

Let’s see how to send data to Kafka in AVRO format from PHP producer, so that Kafka Connect can parse it and put data to sink.

I assume you know the basics of AVRO and Schema Registry, but if not – let me know in the comments, I’d be happy to help with setting up Schema Registry! Footnote: the easiest way is it, is to use Confluent’s official Docker image and deploy it on Kubernetes.

In order to use PHP producer which will serialize payloads in AVRO, we need to send it in a particular „envelope”, which contains schema ID. This way Kafka Connect will know which schema should be retrieved from Schema Registry.

Let’s consider, that our PHP Kafka producer will send simple payload:

$data = [
  'time' => '2020-09-24 20:45:00',
  'level' => 'info',
  'channel' => 'main',
  'message' => 'Some log entry has been produced',
];

First of all, you need to create an AVRO schema for that. You can get one by using number of tools available online, like this.

Our AVRO schema will look like this:

$schema = <<<SCHEMA
{
  "name": "LogEntry",
  "type": "record",
  "namespace": "pl.sznapka",
  "fields": [
    {
      "name": "time",
      "type": "string"
    },
    {
      "name": "level",
      "type": "string"
    },
    {
      "name": "channel",
      "type": "string"
    },
    {
      "name": "message",
      "type": "string"
    }
  ]
}
SCHEMA;

Next step is to register our AVRO schema in Schema Registry and obtain its ID. You can either call Schema Registry API directly or use PHP library flix-tech/confluent-schema-registry-api (which I recommend).

Note – you should register your schema under Kafka topic name with suffix ‚-value’

$kafkaTopicName = 'logs';
$subject = $kafkaTopicName . '-value';
$schemaRegistry->register($subject, \AvroSchema::parse($schema));

Once your schema is in the Schema Registry you need to retrieve ID for your subject:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: matipl, dodany: 27.04.2020 15:43, tagi: php

W zeszłym tygodniu wspomniałem m.in. o spostrzeżeniach jakimi dzieli się Ola Kunysz. W drugim vlogu zatytułowanym „Wstyd się przyznać do niewiedzy?” poruszyła ona temat rekrutacji w IT z punktu widzenia rekrutera. Bardzo dobre pogaduchy, ale zatrzymałem się myślami nad:

Znacie pewnie te rozmowy rekrutacyjne, na których ktoś pyta: jak wywołać Garbage Collector?

Czy, aby na pewno jest to pytanie z „podręcznika dobrych pytań na rozmowę rekrutacyjną?” Nie sądzę, ponieważ takiego podręcznika nie mam (a jest dostępny?), a zdarza mi się pytać o bardziej niskopoziomowe sprawy… I tak zastanawiając się nad tym pytaniem zdałem sobie sprawę, że nie dzieliłem się tutaj sprawami dotyczącymi rekrutacji. Od ponad 10 lat w różnych firmach wcielam się w rolę rekrutera. Masa doświadczenia za mną. Po latach wiem na pewno jakiej osoby szukam i to bez znaczenia na stanowisko (absolwent, osoba starająca się przekwalifikować, programista z kilkuletnim doświadczeniem, architekt itd.).

Osoba z pasją

Kogo szukam? Osoby z pasją, której błyszczą się oczy, gdy tylko mówi o tym co lubi robić. Pasją w tej chwili nie musi być IT, możesz być na początku swojej drogi w IT, jako programista, mieć naprawdę małe doświadczenie, ale w trakcie luźnej rozmowy da się wyczuć, że jesteś osobą ambitną, lubiącą rozwój i posiadasz odpowiedni sposób myślenia, kojarzenia faktów.

Ponieważ technologie, biblioteki, języki czy znajomość dobrych praktyk programistycznych (np. wzorce, psr-y) są to rzeczy nabyte. Jeśli posiada się otwarty umysł na wiedzę, chęć rozwoju (i nie mówię tutaj o szumnych zapowiedziach, ale faktycznych działaniach) to z czasem taka osoba może wszystko nadrobić i stać się nawet liderem w zespole. Mógłbym tutaj przytoczyć masę historii osób, które teraz są świetnymi programistami, rozwiązującymi skomplikowane zagadnienia. A na rekrutacji były to osoby zasiedziałe w firmie jednego projektu, gdzie zajmowały się od lat wyłącznie utrzymaniem, lub osoby, które ogarniały w firmie wszystko z małą ilością czasu na programowanie. Oczywiście, zdarzały się osoby znakomite pod względem doświadczenia już na rekrutacji, ale cześto pojawiały się na rozmowie, bo w obecnym miejscu były redukcje. Jak również znam kilka osób, które widziałbym w IT, a teraz są zupełnie w innych branżach. Wiem, że rewelacyjnie poradziliby sobie jako analitycy czy programiści, widzę podczas rozmów jak rozwiązują pewne zagadnienia, łącza fakty… ale nie widzą się w IT. Szkoda.

PHPCon Poland 2015 - gadżety

Trudne pytania?

Czy nieraz pojawia się pytanie o OpCache? W jaki sposób i gdzie PHP przechowuje dane, czy da się coś zoptymalizować w konfiguracji, czy pisało się własne rozszerzenia w C. Tak – pojawiają się takie pytania, ponieważ projekty są różne i różne jest zapotrzebowanie kadrowe. Ale nie zrażaj się takimi pytaniami. Nie wiesz i tyle, wiedza rzecz nabyta tylko o tym powiedz. Inną kwestią jest co zrobisz ze swoją niewiedzą po spotkaniu? Poprosisz o maile z podsumowaniem, czego nie wiedziałeś, sam poszukasz w Internecie odpowiedzi, douczysz się dla samego siebie… Czy stwierdzisz – co za głupia rekrutacja, po co mam to wiedzieć…

Rozmowa

Rozmawiam o wszystkim. Moim punktem startu, jest to co otrzymam od kandydata. Nieraz się zdarza, że poza pytania dotyczące CV w ogóle nie wychodzimy, ponieważ jest interesujące (nie tylko sprawy z IT), są miejsca, których można się „uczepić” (np. Raspberry Pi). Gdy czasami CV jest ubogie, i po 2-3 pytaniach nie mamy o czym rozmawiać to zaczynam zadawać pytania ogólne dotyczące rozwiązywania problemów. Nie są to pytania o algorytmy, wiedzę stricte uniwersytecką, ale o życiowy projekt i problem jaki się tam zdarzył lata temu. Jakbyś go rozwiązał? Gdy wiem lub czuję, że to osoba z całą teczką wykonanych projektów, z niesamowitą ilością problemów, które spotkała w IT zadaje kilka pytań związanych z dzisiaj używanymi technologiami i tyle. Koniec, kropka w notatce ze spotkania…

To jest rozmowa, techniczna, ale rozmowa. Zdarza się nieraz, że w trakcie rozmowy odkrywam, że dana osoba ma predyspozycje do pracy zdalnej lub samodzielnego projektu, niż pracy w zespole kilkuosobowym. Ale najczęściej sprawami dotyczących kompetencji tzw. miękkich zajmuje się dział HR, który jest po prostu w tym lepszy.

Czego się uczyć?

Mam wrażenie, że podczas spotkań (rekrutacji) coraz mniej osób pyta jak zdobyć wiedzę, co mogą poprawić, jaka jest poprawna odpowiedź na zadane pytanie. Dzisiejszy świat dostępu do informacji jest zupełnie inny niż 15 lat temu i można z tego skorzystać. Jest masa spotkań lokalnych (zapraszam do kalendarza, teraz odbywających się online), konferencji w Polsce, a konferencje za granicą stały się łatwiej dostępne. A nawet jeśli nas nie stać na wyjazd, poświęcenia dnia pracy, to jest masa nagrań z konferencji w Internecie (Boiling Frogs, PHPCon Poland, WebSummerCamp) czy podcasty. Może w tej chwili nie użyjesz technologii, o której usłyszysz na konferencji. Ale przy rozpoczęciu następnego projektu okaże się, że znasz idealne narzędzie do rozwiązania tego problemu?

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: matipl, dodany: 24.04.2020 10:56, tagi: php, technologie

Spora część z nas, osób pracujących w IT ograniczyła ilość spotkań, udział w konferencjach czy lokalnych spotkaniach. Dlatego tym bardziej cieszy mnie, że pojawia się w Sieci coraz więcej materiałów wartych uwagi, dzięki którym nie tylko początkujący w branży (programiści, testerzy, analitycy) mogą wiele się nauczyć i poznać inny punkt widzenia. Dzisiaj chcę zapoznać Was z 2 interesującymi osobami, a raczej z ich działalnością w Internecie…

Mariusz Gil - Better Software Design

Mariusz Gil (Better Software Design)

Wydaje mi się, że Mariusza nie trzeba przedstawiać – programista wywodzący się z PHP, architekt oprogramowania, obecnie „opowiada” o DDD. W kwietniu rozpoczął nowy projekt – podcast Better Software Design. Jest to podcast o architekturze, szczegółach implementacyjnych, problemach życia codziennego projektów widziany trochę z wyższej półki, opowiedziane przez osoby ze sporym dorobkiem zawodowym. Jest on prowadzony w formie wywiadów. Obecnie ukazały się 4 odcinki, które krążą wokół DDD (Domain-Driven Design) i wydajności. Jest to wyśmienite uzupełnienie szkoleń organizowanych przez Bottegę, czy ścieżki Bottega IT minds na konferencji 4Developers, na których Mariusz i inne osoby z Bottegi dzielą się swoim doświadczeniem z walki w dużych projektach.

Ola Kunysz - O jakości dla programistów

Ola Kunysz (podcast & vlog)

Ola jest programistką, z wieloletnim doświadczeniem w branży, z bardziej Javowej strony. Mogliście ją już posłuchać na licznych konferencjach, gdzie udzielała się jako prelegentka (np. Boiling Frogs, Wrocław JUG, Sphere.IT). Od pewnego czasu dzieli się swoim doświadczeniem, spojrzeniem na oprogramowanie tworząc podcast „O jakości dla programistów”, a bardziej regularnie jest aktywna na YouTube. Tam też (na YT) od kilku dni ukazuje się vlog Oli – serdecznie polecam. Porusza tematy zaczynając od procesu rekrutacji w firmach kończąc na pasji, perfekcjonizmie. Bardzo wartościowe uwagi szczególnie dla twórców oprogramowania z krótkim stażem, ale również wieloletni ludzie z branży znajdą coś dla siebie.

Również SegFault stara się wystartować z własnymi audycjami, ale na razie powstał tylko 1 odcinek w ramach „segfault audio”. Mam nadzieję, że będzie więcej.

Artykuł Podcasty: Mariusz Gil (Better Software Design) & Ola Kunysz (O jakości) pochodzi z serwisu Mateusz matipl Kamiński.

Autor wpisu: matipl, dodany: 24.01.2019 14:45, tagi: php

PHP 7 jest już z nami 3 lata. Właśnie wygaszono PHP 7.0 oraz PHP 5.6, czyli nie są już w żaden sposób wspierane przez społeczność pracującą przy core PHP. Statystyki na podstawie pobrań Composera w połowie 2018 roku mówią, że około 80% to już PHP 7.* – jest dobrze można pomyśleć. Aż tu nagle znajduje się pewien problem…

Phalcon

Nie wiem, czy każdy z Was słyszał o Phalconie – frameworku PHP napisanym w C, kompilowanym jako rozszerzenie PECL. W 2016 roku, kilka miesiący po ukazaniu się PHP 7, został opublikowany Phalcon 3.0 z pełnym wsparciem dla PHP 7.0. Prawie każdy o nim mówił, ponieważ samo użycie PHP 7 przyspieszało aplikacje, a co dopiero pomyśleć gdyby ktoś również korzystał z frameworka, który nie musi za każdym razem ładować setek swoich plików, tylko byłby natywnie dołączany do PHP… Sam byłem zachwycony, ale nie korzystałem.

Trafiła mi się sprawa związana z dłubaniem w aplikacji opartej o Phalcon 3. Wszystko wydawało się super dopóki zostawało sie na poziomie kontrolerów, widoków, podstawowej konfiguracji. Jak chciałem (musiałem) zrobić coś więcej – optymalizacja zarządzania sesją okazało się, że tutaj nie jest kolorowo. Zderzyłem się ze ścianą – Phalcon posiada nikłą dokumentację, moim zdaniem na poziomie Zend Framework 0.*. Jest prosty guide, wygenerowany „phpdoc” na podstawie komentarzy klas i to wszystko. Chciałbyś poznać dokładną listę parametrów np. do Phalcon\Session\Adapter\Libmemcached – bez szans, chciałbyś zoptymalizować sposób łączenia sie z memcached itd. – bez szans. Okazało się, że może jest to dobry framework, ale podstawowa wiedza rozsiana jest po forach internetowych, brak informacji od speców korzystających z niego do czegoś więcej niż CMS-y i proste serwisy. Dla zainteresowanych warto przeczytać książkę Phalcon PHP Framework Documentation po francusku, ale przynosi trochę więcej wiedzy.

PHP Versions Grouped (May 2018)

Problem

Nie wiem czy pamiętacie, ale 2016 rok nie był rokiem PHP 7. Dlaczego? Mało narzędzi poprawnie współpracowało z PHP 7. W samym slniku dużo zostało zmienione i społeczność od PECL-i nie nadążyła. Firmy/Projekty dopiero robiły przymiarki, szczególnie gdy okazywało się, że aplikacje wymagały refactoringu, aby poprawnie działać na PHP 7 (usunięte rozszerzenia i SAPI w PHP 7.0). W pewnym momencie okazało się, że memcached w końcu działa poprawnie z PHP 7 i poszło wszystko do przodu. Również w projektach, w których brałem udział.

Ale. Do tej pory nie spotkałem się z sytuacją, aby memcached nie mógł poprawnie zawiadywać sesjami i stanowił problem (chociaż są nowsze podejścia, np. Redis jak save_handler). Okazuje się, że PHP 7 w połączeniu z memcached w pewnych sytuacjach (duża ilość requestów „AJAX”) może rzucić:

PHP Warning: session_start(): Unable to clear session lock record in (...)

Jeśli mamy wygłuszone błędy (produkcja) to może to pozostać niezauważone albo po prostu zniknąć w czeluściach logów. Tym bardziej, gdy dzieje się sporadycznie. Ale co właściwie się dzieje?

Rozwiązanie

Okazuje się, że podobny problem (wiele zapytań równoległych z JS „psuje” sesje) ma wiele osób w sieci już od 2016 roku, czyli momentu wydania modułu. Oczywiście można byłoby przepisać miejsca, gdzie wykorzystywana jest sesja i lepiej kontrolować przepływ informacji. Ale to zwiększa koszty pracy, jak również może powodować kolejne komplikacje. Nie pomagało w tej sytuacji zamykanie sesji wcześniej (session_write_close()), ani inne wynalazki (np. nowość w PHP 7 session.lazy_write). Okazuje się, że problem jest dość trywialny i dotyczy domyślnej wartości dla memcached.sess_lock_retries, która od początku wersji 3.0 była ustawiona na 5. Wydaje mi się, że niska wartość w połączeniu z PHP 7 i HTTP2 (jeden kanał do całej komunikacji, mniejsze zatory na zapytaniach) spowodowały ujawnienie błędu domyślnej konfiguracji. W połowie 2017 roku ukazał się odpowiedni Pull Request zmieniający domyslną wartość w INI, jak również w samym C

- ; Default is 1000.
- ;memcached.sess_lock_wait_min = 1000;
+ ; Default is 150.
+ ;memcached.sess_lock_wait_min = 150;

; The maximum time, in milliseconds, to wait between session lock attempts.
-; Default is 2000.
-;memcached.sess_lock_wait_max = 2000;
+; Default is 150.
+;memcached.sess_lock_wait_max = 150;

; The number of times to retry locking the session lock, not including the first attempt.
-; Default is 5.
-;memcached.sess_lock_retries = 5;
+; Default is 200.
+;memcached.sess_lock_retries = 200;

Ustawienie w aplikacji ini_set(‚memcached.sess_lock_retries’, 200) rozwiązało problem z lockowaniem się sesji, ale… Wyłącznie w przypadku natywnego rozwiązania, tj. $_SESSION (które bazuje na konfiguracji PHP). Niestety wykorzystanie wspomnianego Phalcon\Session\Adapter\Libmemcached w aplikacji powoduje nadal ten sam błąd. Widać Phalcon (C) nie bierze pod uwagę konfiguracji pecl-memcached (C) i jedzie po swojemu.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.