PHP ma dwa różne interfejsy API do interakcji z gniazdami. Istnieje interfejs API niskiego poziomu, który zasadniczo owija interfejs API gniazda C. Jest też interfejs API strumieniowego wysokiego poziomu, który implementuje interfejs strumienia PHP.Konwersja zasobu gniazda na gniazdo strumieniowe
Niestety, interfejs API gniazda strumieniowego nie obsługuje ustawiania opcji gniazda niskiego poziomu. Jednak to jest coś, co muszę zrobić. Podobnie gniazdo API nie obsługuje standardowych wywołań funkcji, takich jak fread
, fwrite
i fclose
, co powoduje, że jest on niezgodny z resztą mojego kodu.
PHP 5.4 wprowadziło funkcję socket_import_stream. Umożliwia to pobranie gniazda strumieniowego i uzyskanie podstawowego zasobu gniazda. Mój plan polegał na wykorzystaniu tego do utworzenia gniazda strumieniowego, pobrania gniazda, ustawienia niektórych opcji, a następnie kontynuowania używania oryginalnego gniazda strumieniowego.
Powód, dla którego to nie zadziałało, polega na tym, że muszę ustawić opcje przed wiązaniem. Jedynym sposobem związania gniazda strumienia jest użycie stream_socket_server, które już wykonuje wiązanie. Dlatego nie mogłem go użyć.
Poszukuję teraz odwrotności socket_import_stream
, aby przekonwertować zasób gniazda na gniazdo strumieniowe. Nie udało mi się znaleźć takiej funkcji, ale mam nadzieję, że bardzo mądrzy ludzie mogą mi pomóc. Lub prześlij łatkę do źródła PHP, które to robi. Albo podpowiedz mi, jak napisać taką łatkę.
EDYCJA: Mam kod, który działa na strumień PHP do parsowania pakietów DNS z niego. Chcę ponownie użyć tego kodu z gniazdem obsługującym multiemisję. Nie mogę włączyć multiemisji na gnieździe strumieniowym i nie mogę korzystać z funkcji strumieniowych na surowym gnieździe.
EDIT2: Chcę użyć tego strumienia z stream_select
, więc niestandardowe obwoluty strumienia nie są opcją, niestety.
Komentarz z kodu źródłowego PHP: 'przytrzymaj referencję do strumienia w strumieniu (przytrzymanie php_stream * może być wykonane bezpośrednio, ale może to być nieco lepsze, jeśli w przyszłości chcemy zapewnić socket_export_stream)' https: // bitbucket.org/php/php-src/src/0ef8b095ccda/ext/sockets/sockets.c#cl-2524 Domyślam się, że 'socket_export_stream' to funkcja, której szukasz, niestety wygląda na to, że jeszcze nie została zaimplementowana. – umpirsky
Przedstawiasz tylko problemy, które napotkałeś, wprowadzając "rozwiązanie" nieopisanego problemu.Rozłóż także oryginalny problem, być może istnieją inne sposoby. –
@ Tiberiu-IonuţStan Dodałem więcej informacji o moim problemie. – igorw