Desejo fazer uma solicitação GET simples para outro script em um servidor diferente. Como eu faço isso?
Em um caso, eu só preciso solicitar um script externo sem a necessidade de qualquer saída.
make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
No segundo caso, preciso obter a saída de texto.
$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Para ser honesto, não quero mexer com o CURL, pois esse não é realmente o trabalho do CURL. Eu também não quero usar http_get porque não tenho as extensões PECL.
O fsockopen funcionaria? Em caso afirmativo, como faço isso sem ler o conteúdo do arquivo? Não há outra maneira?
Obrigado a todos
Atualizar
Devo acrescentar, no primeiro caso, não quero esperar que o script retorne nada. Pelo que entendi file_get_contents () vai esperar a página carregar totalmente etc?
php
http
curl
asynchronous
Abdômen
fonte
fonte
Respostas:
file_get_contents
vai fazer o que você quiserEdit: Uma maneira de disparar uma solicitação GET e retornar imediatamente.
Citado em http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
O que isso faz é abrir um soquete, disparar um pedido get e imediatamente fechar o soquete e retornar.
fonte
curl_post_async
e obter até mesmo votos positivos ...Veja como fazer a resposta do Marquis funcionar com solicitações POST e GET:
fonte
ssl://hostname
vez de apenashostname
.Em relação à sua atualização, sobre não querer esperar que a página inteira carregue - acho que uma
HEAD
solicitação HTTP é o que você está procurando ..get_headers deve fazer isso - acho que ele só solicita os cabeçalhos, portanto, não será enviado o conteúdo completo da página.
"PHP / Curl: a solicitação HEAD demora muito em alguns sites" descreve como fazer uma
HEAD
solicitação usando PHP / CurlSe você deseja acionar a solicitação e não atrasar o script, existem algumas maneiras, de complexidades variadas.
"wget -O /dev/null $carefully_escaped_url"
- isso será específico da plataforma, e você deve ter muito cuidado ao escapar dos parâmetros para o comandofonte
Você não. Embora o PHP ofereça muitas maneiras de chamar uma URL, ele não oferece suporte imediato para fazer qualquer tipo de processamento assíncrono / encadeado por solicitação / ciclo de execução. Qualquer método de envio de uma solicitação de URL (ou uma instrução SQL ou etc.) vai esperar por algum tipo de resposta. Você precisará de algum tipo de sistema secundário rodando na máquina local para conseguir isso (google para "fila de trabalho php")
fonte
Eu recomendaria a você uma biblioteca PHP bem testada: curl-easy
fonte
Se você estiver usando um ambiente Linux, poderá usar o comando exec do PHP para invocar o linux curl. Aqui está um código de amostra, que fará uma postagem HTTP assíncrona.
Este código não precisa de libs PHP extras e pode completar a postagem http em menos de 10 milissegundos.
fonte
fonte
getstatus()
ouwaitSend()
ouwaitResult()
. Dessa forma, o chamador pode obter um comportamento totalmente assíncrono chamando um loop para verificar se há resultados e, se não houver, continuar em qualquer outra tarefa que esteja sendo executada. Hmm, agora eu quero transferirTask
de .net para php ...Problema interessante. Suponho que você deseja apenas acionar algum processo ou ação no outro servidor, mas não se preocupe com quais são os resultados e deseja que seu script continue. Provavelmente, há algo em cURL que pode fazer isso acontecer, mas você pode querer considerar o uso
exec()
para executar outro script no servidor que faz a chamada, se cURL não puder fazer isso. (Normalmente as pessoas querem os resultados da chamada do script, então não tenho certeza se o PHP tem a capacidade de apenas acionar o processo.) Comexec()
você pode executar umwget
ou até mesmo outro script PHP que faça a solicitação comfile_get_conents()
.fonte
É melhor você considerar o uso de filas de mensagens em vez de métodos recomendados. Tenho certeza de que essa será a solução melhor, embora exija um pouco mais de trabalho do que apenas enviar uma solicitação.
fonte
deixe-me mostrar o meu caminho :)
precisa de nodejs instalado no servidor
(meu servidor envia 1000 https solicitação get leva apenas 2 segundos)
url.php:
urlscript.js>
fonte
Para mim, a pergunta sobre a solicitação GET assíncrona surgiu devido a uma situação em que preciso fazer centenas de solicitações , obter e lidar com dados de resultado em cada solicitação e cada solicitação leva milissegundos significativos de execução, o que leva a minutos (!) De execução total com simples
file_get_contents
.Neste caso, foi muito útil o comentário de w_haigh em php.net sobre a função http://php.net/manual/en/function.curl-multi-init.php
Então, aqui está minha versão atualizada e limpa de fazer muitas solicitações simultaneamente. No meu caso, é equivalente à forma "assíncrona". Pode ser que ajude alguém!
É fácil reescrever isso para lidar com POST ou outros tipos de solicitações HTTP (S) ou qualquer combinação deles. E suporte a cookies, redirecionamentos, http-auth, etc.
fonte
Experimentar:
Isso NÃO funcionará como um módulo apache, você precisa usar CGI.
fonte
Achei este link interessante para fazer processamento assíncrono (obter solicitação).
Askapache
Além disso, você pode fazer processamento assíncrono usando uma fila de mensagens como, por exemplo, beanstalkd.
fonte
Aqui está uma adaptação da resposta aceita para realizar uma solicitação GET simples.
Uma coisa a se observar se o servidor reescrever qualquer URL, isso não funcionará. Você precisará usar um cliente http com mais recursos.
fonte
Apenas algumas correções nos scripts postados acima. O seguinte está funcionando para mim
fonte
Ninguém parece mencionar o Guzzle , que é um cliente PHP HTTP que facilita o envio de solicitações HTTP. Pode funcionar com ou sem
Curl
. Ele pode enviar solicitações síncronas e assíncronas.fonte
Com base neste tópico, fiz isso para meu projeto codeigniter. Funciona muito bem. Você pode ter qualquer função processada em segundo plano.
Um controlador que aceita as chamadas assíncronas.
E uma biblioteca que faz as chamadas assíncronas
Este método pode ser chamado para processar qualquer model :: method () no 'background'. Ele usa argumentos variáveis.
fonte
Sugestão: formate uma página HTML FRAMESET que contenha, digamos, 9 frames dentro. Cada quadro OBTERÁ uma "instância" diferente de sua página myapp.php. Haverá 9 threads diferentes em execução no servidor Web, em paralelo.
fonte
Para PHP5.5 +, mpyw / co é a solução definitiva. Funciona como se fosse tj / co em JavaScript.
Exemplo
Suponha que você deseja baixar os avatares de vários usuários do GitHub especificados. As etapas a seguir são necessárias para cada usuário.
<img class="avatar" src="...">
e solicite (OBTER IMAGEM)---
: Esperando minha resposta...
: Esperando outra resposta em fluxos paralelosMuitos
curl_multi
scripts baseados em famosos já nos fornecem os seguintes fluxos.No entanto, isso não é eficiente o suficiente. Você deseja reduzir tempos de espera inúteis
...
?Sim, é muito fácil com mpyw / co. Para mais detalhes, visite a página do repositório.
fonte
Aqui está minha própria função PHP quando faço POST em uma URL específica de qualquer página ....
Exemplo: * uso da minha função ...
fonte
Experimente este código ....
Não se esqueça de habilitar a extensão CURL php.
fonte
CURLOPT_TIMEOUT_MS
por exemplo, 100 milissegundos em vez deCURLOPT_TIMEOUT
segundos e um mínimo de 1 segundo - para uma execução mais rápida.Isso funciona bem para mim, infelizmente você não pode recuperar a resposta de sua solicitação:
Funciona muito rápido, sem necessidade de soquetes tcp brutos :)
fonte