Po migrácii z Laravel Sail na Herd na Macu som potreboval nájsť spôsob, ako rozbehnúť websockety, keďže ich táto aplikácia využívala. Predtým som sa spoliehal na soketi bežiaci vo vlastnom docker compose, no keď Sail odišiel, odišiel aj on. Samozrejme som mohol soketi spustiť cez npm, ale keďže Laravel ponúka vlastné riešenie – Laravel Reverb – rozhodol som sa to vyskúšať.
Po úprave niekoľkých súborov a konfigurácií sa moja aplikácia dokázala pripojiť na websocket, čo som videl na karte Network v prehliadači alebo cez:
php artisan reverb:start --debug
Problém bol v tom, že odosielané udalosti zlyhávali s notoricky známou chybou:
cURL error 60: SSL certificate problem: unable to get local issuer certificate
Strávil som poriadny kus času ladením tohto problému, keďže žiadne vyhľadávanie ani AI mi nevedeli poradiť správnym smerom, konkrétne pri Herd. Musel som sa do toho zaboriť sám.
Laravel Herd php.ini #
Najprv som sa musel uistiť, že použitý php binárny súbor skutočne
pochádza z Herd:
/Users/peterbabic/Library/Application Support/Herd/bin/php
Vyššie uvedený súbor je symlink na skutočný binárny súbor:
ll /Users/peterbabic/Library/Application\ Support/Herd/bin/php
lrwxr-xr-x@ 1 peterbabic staff 61B Jul 30 09:18 /Users/peterbabic/Library/Application Support/Herd/bin/php@ -> /Users/peterbabic/Library/Application Support/Herd/bin//php84
Pri prehľadávaní adresárovej štruktúry Herd som našiel php.ini súvisiaci
s bežiacou verziou PHP 8.4:
cat /Users/peterbabic/Library/Application\ Support/Herd/config/php/84/php.ini
Vráti tieto riadky, pričom druhý riadok je práve ten, ktorý hľadáme:
curl.cainfo=/Users/peterbabic/Library/Application Support/Herd/config/php/cacert.pem
openssl.cafile=/Users/peterbabic/Library/Application Support/Herd/config/php/cacert.pem
pcre.jit=0
output_buffering=4096
memory_limit=128M
upload_max_filesize=2M
post_max_size=2M
Keď som však overil, či php binárny súbor toto nastavenie načítava, ukázalo sa, že nenačítava:
php -i | grep -i ssl
Konkrétne riadok openssl.cafile => no value => no value bol vinníkom:
Registered Stream Socket Transports => tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3
SSL => Yes
MULTI_SSL => No
SSL Version => OpenSSL/3.5.1
SSL Support => enabled
libmongoc SSL => enabled
libmongoc SSL library => OpenSSL
core SSL => supported
extended SSL => supported
openssl
OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 3.5.1 1 Jul 2025
OpenSSL Header Version => OpenSSL 3.5.1 1 Jul 2025
Openssl default config => /etc/ssl/openssl.cnf
openssl.cafile => no value => no value
openssl.capath => no value => no value
OpenSSL support => enabled
Samozrejme systém nemôže načítať certifikát, keď mu to vôbec nebolo povedané!
Certifikát #
Pri prehľadávaní adresárovej štruktúry Herd som jasne videl, že certifikát tam bol:
stat /Users/peterbabic/Library/Application\ Support/Herd/config/php/cacert.pem
Ak z nejakého dôvodu nie je prítomný, jednoducho ho zregenerujte príkazom
herd secure, ktorý vypíše nasledujúce a vytvorí súbor:
The [laravel.test] site has been secured with a fresh TLS certificate.
Prečo teda php nenačítavalo php.ini súbor poskytnutý Herdom? Táto otázka
bola dobrým bodom na hľadanie, keďže sa ukázala plodnou.
Nastavenie #
Pre môj fish shell setup som musel pridať tieto premenné do config.fish,
aby ich Herd mohol prevziať:
set -x HERD_PHP_85_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/85/"
set -x HERD_PHP_84_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/84/"
set -x HERD_PHP_83_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/83/"
set -x HERD_PHP_82_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/82/"
set -x HERD_PHP_81_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/81/"
set -x HERD_PHP_80_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/80/"
set -x HERD_PHP_74_INI_SCAN_DIR "/Users/peterbabic/Library/Application Support/Herd/config/php/74/"
Po opätovnom otvorení a reštarte všetkého som mohol spustiť niekoľko potvrdzujúcich príkazov:
php -i | grep -i scan
Teraz správne zobrazovalo cestu na prehľadávanie Herd php.ini súboru:
Scan this dir for additional .ini files => /Users/peterbabic/Library/Application Support/Herd/config/php/84/
A openssl.cafile mal teraz tiež správnu hodnotu:
openssl.cafile => /Users/peterbabic/Library/Application Support/Herd/config/php/cacert.pem => /Users/peterbabic/Library/Application Support/Herd/config/php/cacert.pem
Enjoy!
Odkazy #
- https://github.com/beyondcode/herd-community/issues/129#issuecomment-1688116995
- https://github.com/beyondcode/herd-community/issues/267#issuecomment-1850042661
- https://github.com/beyondcode/herd-community/issues/292#issue-2070639721
- https://laracasts.com/discuss/channels/reverb/curl-error-1-received-http09-when-not-allowed