Jaki jest najprostszy sposób (bez otwierania powłoki do zwijania i czytania ze standardowego wejścia) w Perlu, aby przesyłać strumieniowo z innego zasobu HTTP? Zakładam, że zasób HTTP, z którego czytam, jest potencjalnie nieskończonym strumieniem (lub po prostu naprawdę, bardzo długim).Jaki jest najprostszy sposób w czystym Perlu do przesyłania strumieniowego z innego zasobu HTTP?
Odpowiedz
HTTP::Lite Metoda request
umożliwia określenie wywołania zwrotnego.
Parametr
$data_callback
, jeśli jest używany, jest sposobem filtrowania danych po ich otrzymaniu lub obsługi dużych transferów. Musi to być odwołanie do funkcji i zostanie przekazane: odwołanie do instancji żądania http wywołującego wywołanie zwrotne, odwołanie do bieżącego bloku danych, które ma zostać dodane do treści, oraz parametr$cbargs
(który może być wszystkim). Musi zwracać odwołanie do danych, które mają zostać dodane do treści dokumentu, lub undef.
Jednak patrząc na źródło, nie wydaje być błąd w To wydaje bezpieczniejsze w użyciu sub request
tym, że wydaje zignorować przeszła zwrotnego.set_callback
:
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Lite;
my $http = HTTP::Lite->new;
$http->set_callback(\&process_http_stream);
$http->http11_mode(1);
$http->request('http://www.example.com/');
sub process_http_stream {
my ($self, $phase, $dataref, $cbargs) = @_;
warn $phase, "\n";
return;
}
wyjściowa:
C:\Temp> ht connect content-length done-headers content content-done data done
wygląda jak zwrotnego przekazanego do metody request
jest traktowany inaczej:
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Lite;
my $http = HTTP::Lite->new;
$http->http11_mode(1);
my $count = 0;
$http->request('http://www.example.com/',
\&process_http_stream,
\$count,
);
sub process_http_stream {
my ($self, $data, $times) = @_;
++$$times;
print "$$times====\n$$data\n===\n";
}
Event::Lib da łatwy interfejs do najszybszej asynchronicznej metody IO r platforma.
IO::Lambda jest również całkiem niezły do tworzenia szybkich, responsywnych aplikacji IO.
Uh, trzymaj z AnyEvent. – jrockway
Nie wiedziałem o tym module. Wygląda świetnie! –
Dobra stara LWP pozwala przetwarzać wynik jako strumień.
Np. Tutaj jest wywołanie zwrotne do funkcjiFunc, odczytywanie/przekazywanie bajtów bajtów do każdego wywołania do funkcjiFunc (możesz pominąć ten parametr, jeśli nie obchodzi Cię, jak duże są dane dla każdego połączenia, i po prostu chcesz przetworzyć strumień tak szybko jak to możliwe):
use LWP;
...
$browser = LWP::UserAgent->new();
$response = $browser->get($url,
':content_cb' => \&yourFunc,
':read_size_hint' => byte_count,);
...
sub yourFunc {
my($data, $response) = @_;
# do your magic with $data
# $respose will be a response object created once/if get() returns
}
+1, to mogło zadziałało, nie miałem okazji wypróbować tego, ponieważ inna odpowiedź zadziałała zanim miałem szansę to zaimplementować. – cgp
Hah, ja * wiedziałem * to! Po prostu nie mogłem go znaleźć w dokumentach, więc wymazałem odpowiedź na wpół nałogową :) – Ether
@Nie też tego nie pamiętałem, ale zauważ, że 'LWP' i' LWP :: Simple' to różne bestie. –
Czekaj, nie rozumiem. Dlaczego wykluczasz oddzielny proces? To:
open my $stream, "-|", "curl $url" or die;
while(<$stream>) { ... }
z pewnością wygląda na "najprostszy sposób" do mnie. Jest to z pewnością łatwiejsze niż inne sugestie tutaj ...
Nie jestem tego pewien, ale czy ten blok nie zostanie wyświetlony, dopóki curl nie odczyta pełnej odpowiedzi? –
Nie, curl wypluwa, gdy się pojawia; nie buforuje niczego w pamięci. Możesz zweryfikować siebie, chwytając duży plik i obserwując rozmiar procesu zwijania podczas ładowania. –
Wolę nie tworzyć wątków, ale poza tym jest to dobre rozwiązanie. – cgp
- 1. Jaki jest najprostszy sposób utworzenia żądania HTTP GET w Perlu?
- 2. Gdzie są narzędzia do strumieniowego przesyłania strumieniowego MAC OSX
- 3. Co zrobić z błędami podczas przesyłania strumieniowego treści żądania Http
- 4. WebAPI Wniosek Obsługa przesyłania strumieniowego
- 5. Używanie Tomcat do przesyłania strumieniowego
- 6. Używanie szyfrowania openssl do przesyłania strumieniowego HTTP firmy Apple
- 7. Najprostszy sposób dopasowania tablicy łańcuchów do wyszukiwania w perlu?
- 8. Postęp przesyłania strumieniowego AVPlayer
- 9. Tworzenie strony internetowej do strumieniowego przesyłania wideo
- 10. Czy używasz produktów do strumieniowego przesyłania zdarzeń?
- 11. Najlepszy sposób przesyłania danych z serwera http do klienta przeglądarki
- 12. Jaki jest najlepszy sposób przesyłania strumieniowego na żywo przez kamerę iPhone na serwer multimediów?
- 13. Jaki jest najlepszy, najprostszy uploader plików ajax?
- 14. Najlepsze praktyki przesyłania strumieniowego audio
- 15. Jaki jest najprostszy sposób wywołania adresu URL POST HTTP za pomocą Delphi?
- 16. Uszkodzona rura podczas przesyłania strumieniowego
- 17. Jaki jest najprostszy sposób obsługi zdarzenia SelectedItem z MVVM?
- 18. Aplikacja do strumieniowego przesyłania strumieniowego na iOS nie odtwarza muzyki w trybie tła
- 19. Najbardziej efektywny sposób przesyłania strumieniowego na liście kontraktów Futures
- 20. Jaki jest najprostszy sposób na zbudowanie strony z rezerwacją spotkania?
- 21. Jaki jest najprostszy sposób na usunięcie pustych NSStrings z NSArray?
- 22. Jaki jest najprostszy sposób na utrzymanie map/struktur w Clojure?
- 23. Bufor do przesyłania strumieniowego do klienta w Express
- 24. Jaki jest dobry sposób przesyłania danych binarnych do usługi HTTP REST API?
- 25. Jaki jest najprostszy międzyplatformowy sposób wyświetlania okien dialogowych w Pythonie?
- 26. Jaki jest najprostszy sposób na iterację w tablicy tablic?
- 27. Jaki jest najprostszy sposób wykonania klasy Java co 30 sekund?
- 28. Jak powinienem utworzyć aplikację internetową do strumieniowego przesyłania wideo?
- 29. Jaki jest najprostszy sposób na uniknięcie HTML w Pythonie?
- 30. Jaki jest najprostszy sposób użycia szablonów widoku wąsów w szynach?
Niesamowite, to mogłoby wyjaśniać, dlaczego nie ważne co robiłem dokumenty, które wróciłem, były 0 bajtów. – cgp
Zgłoszenie błędu: https://rt.cpan.org/Ticket/Display.html?id=50498 –
Obie były dobre, ale użyłem tego. – cgp