Chciałbym wysłać proste żądanie GET do innego skryptu na innym serwerze. Jak mam to zrobic?
W jednym przypadku wystarczy, że zażądam zewnętrznego skryptu bez potrzeby wyświetlania jakichkolwiek danych wyjściowych.
make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
W drugim przypadku muszę uzyskać wynik tekstowy.
$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Szczerze mówiąc, nie chcę bawić się CURL, ponieważ tak naprawdę nie jest to zadanie CURL. Nie chcę również korzystać z http_get, ponieważ nie mam rozszerzeń PECL.
Czy fsockopen zadziała? Jeśli tak, jak mam to zrobić bez wczytywania zawartości pliku? Czy nie ma innego wyjścia?
Dziękuje wszystkim
Aktualizacja
Dodam, że w pierwszym przypadku nie chcę czekać, aż skrypt coś zwróci. Jak rozumiem, file_get_contents () będzie czekać na pełne załadowanie strony itp.?
php
http
curl
asynchronous
Abs
źródło
źródło
Odpowiedzi:
file_get_contents
zrobisz, co chceszEdycja: jeden sposób na odpalenie żądania GET i natychmiastowy powrót.
Cytat z http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
To co robi to otwarcie gniazda, odpalenie żądania get i natychmiastowe zamknięcie gniazda i zwrócenie.
źródło
curl_post_async
i zdobyć nawet pozytywne głosy ...Oto jak sprawić, by odpowiedź Marquis działała zarówno z żądaniami POST, jak i GET:
źródło
ssl://hostname
zamiast po prostuhostname
.Jeśli chodzi o twoją aktualizację, nie chcesz czekać na załadowanie całej strony - myślę, że
HEAD
szukasz żądania HTTP .get_headers powinno to zrobić - myślę, że żąda tylko nagłówków, więc nie zostanie wysłana pełna zawartość strony.
„PHP / Curl: Żądanie HEAD zajmuje dużo czasu w niektórych witrynach” opisuje, jak wykonać
HEAD
żądanie za pomocą PHP / CurlJeśli chcesz wywołać żądanie, a nie wstrzymywać skryptu w ogóle, istnieje kilka sposobów o różnym stopniu złożoności.
"wget -O /dev/null $carefully_escaped_url"
- będzie to specyficzne dla platformy i musisz bardzo uważać na ucieczkę parametrów do poleceniaźródło
Ty nie. Chociaż PHP oferuje wiele sposobów wywoływania adresu URL, nie oferuje standardowej obsługi wykonywania jakiegokolwiek przetwarzania asynchronicznego / wątkowego na cykl żądania / wykonania. Każda metoda wysłania żądania adresu URL (lub instrukcji SQL, itp.) Będzie czekać na jakąś odpowiedź. Aby to osiągnąć, będziesz potrzebować jakiegoś dodatkowego systemu działającego na komputerze lokalnym (wyszukaj „kolejkę zadań php”)
źródło
Polecam dobrze przetestowaną bibliotekę PHP: łatwe w zwijaniu
źródło
Jeśli używasz środowiska Linux, możesz użyć polecenia exec w PHP, aby wywołać curl linux. Oto przykładowy kod, który utworzy asynchroniczny post HTTP.
Ten kod nie wymaga żadnych dodatkowych bibliotek PHP i może zakończyć wysyłanie wiadomości http w mniej niż 10 milisekund.
źródło
źródło
getstatus()
lubwaitSend()
lubwaitResult()
. W ten sposób obiekt wywołujący może uzyskać zachowanie w pełni asynchroniczne, wywołując pętlę w celu sprawdzenia, czy są wyniki, a jeśli nie, kontynuuje dowolne inne uruchomione zadanie. Hmm, teraz chcę przenieśćTask
z .net do php…Ciekawy problem. Domyślam się, że chcesz po prostu uruchomić jakiś proces lub akcję na innym serwerze, ale nie obchodzi cię, jakie są wyniki i chcesz, aby twój skrypt kontynuował. Prawdopodobnie w cURL jest coś, co może to spowodować, ale możesz rozważyć użycie
exec()
do uruchomienia innego skryptu na serwerze, który wykonuje wywołanie, jeśli cURL nie może tego zrobić. (Zwykle ludzie chcą wyników wywołania skryptu, więc nie jestem pewien, czy PHP ma możliwość po prostu wyzwolenia procesu.) Za pomocąexec()
można uruchomićwget
lub nawet inny skrypt PHP, który wysyła żądanie za pomocąfile_get_conents()
.źródło
Lepiej rozważ użycie kolejki wiadomości zamiast zalecanych metod. Na pewno będzie to lepsze rozwiązanie, choć wymaga trochę więcej pracy niż samo wysłanie zapytania.
źródło
pokażę ci moją drogę :)
wymaga zainstalowania nodejs na serwerze
(mój serwer wysyła 1000 https żądanie pobrania zajmuje tylko 2 sekundy)
url.php:
urlscript.js>
źródło
U mnie pojawiło się pytanie o asynchroniczne żądanie GET, ponieważ spotkałem się z sytuacją, w której muszę wykonać setki żądań , pobrać i obsłużyć dane wynikowe na każdym żądaniu, a każde żądanie zajmuje znaczące milisekundy wykonania, co prowadzi do minut (!) całkowite wykonanie z prostym
file_get_contents
.W tym przypadku bardzo pomocny był komentarz w_haigh na php.net o funkcji http://php.net/manual/en/function.curl-multi-init.php
Oto moja ulepszona i oczyszczona wersja wykonywania wielu żądań jednocześnie. W moim przypadku jest to równoznaczne ze sposobem „asynchronicznym”. Może to komuś pomoże!
Łatwo jest to przepisać, aby obsługiwać POST lub inne typy żądań HTTP (S) lub dowolną ich kombinację. Obsługa plików cookie, przekierowania, http-auth itp.
źródło
Próbować:
To NIE zadziała jako moduł Apache, musisz używać CGI.
źródło
Znalazłem ten interesujący link do przetwarzania asynchronicznego (żądanie pobrania).
askapache
Co więcej, możesz wykonywać asynchroniczne przetwarzanie, używając kolejki komunikatów, takiej jak na przykład beanstalkd.
źródło
Oto adaptacja zaakceptowanej odpowiedzi na wykonanie prostego żądania GET.
Należy pamiętać, że jeśli serwer przepisuje adresy URL, to nie zadziała. Musisz użyć bardziej funkcjonalnego klienta http.
źródło
Tylko kilka poprawek do skryptów zamieszczonych powyżej. Poniższe działa dla mnie
źródło
Wydaje się, że nikt nie wspomina o Guzzle , która jest klientem PHP HTTP, który ułatwia wysyłanie żądań HTTP. Może działać z lub bez
Curl
. Może wysyłać zarówno żądania synchroniczne, jak i asynchroniczne.źródło
Na podstawie tego wątku zrobiłem to dla mojego projektu CodeIgniter. Działa dobrze. Możesz mieć dowolną funkcję przetwarzaną w tle.
Kontroler, który akceptuje wywołania asynchroniczne.
I bibliotekę, która wykonuje wywołania asynchroniczne
Tę metodę można wywołać w celu przetworzenia dowolnego model :: method () w 'tle'. Używa zmiennych argumentów.
źródło
Sugestia: sformatuj stronę FRAMESET HTML, która zawiera, powiedzmy, 9 ramek w środku. Każda ramka POBIERA inną „instancję” Twojej strony myapp.php. Na serwerze WWW będzie działać równolegle 9 różnych wątków.
źródło
W przypadku PHP5.5 + mpyw / co jest najlepszym rozwiązaniem. Działa tak, jakby to było tj / co w JavaScript.
Przykład
Załóżmy, że chcesz pobrać określone awatary wielu użytkowników GitHub. Dla każdego użytkownika wymagane są następujące kroki.
<img class="avatar" src="...">
i poproś o to (POBIERZ OBRAZ)---
: Oczekiwanie na odpowiedź...
: Oczekiwanie na inną odpowiedź w równoległych przepływachWiele znanych
curl_multi
skryptów bazowych zapewnia nam już następujące przepływy.Jednak nie jest to wystarczająco wydajne. Czy chcesz skrócić bezwartościowy czas oczekiwania
...
?Tak, z mpyw / co jest to bardzo łatwe. Aby uzyskać więcej informacji, odwiedź stronę repozytorium.
źródło
Oto moja własna funkcja PHP, gdy wykonuję POST na określony adres URL dowolnej strony ...
Przykład: * użycie mojej funkcji ...
źródło
Wypróbuj ten kod ....
Nie zapomnij włączyć rozszerzenia CURL php.
źródło
CURLOPT_TIMEOUT_MS
np. 100 milisekund zamiast tegoCURLOPT_TIMEOUT
w sekundach i min 1 sekundy - dla szybszego wykonania.Dla mnie to działa dobrze, niestety nie możesz odzyskać odpowiedzi na swoje żądanie:
Działa bardzo szybko, nie ma potrzeby stosowania surowych gniazd tcp :)
źródło