Je souhaite faire une simple requête GET à un autre script sur un serveur différent. Comment puis-je faire cela?
Dans un cas, j'ai juste besoin de demander un script externe sans avoir besoin d'aucune sortie.
make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
Dans le second cas, j'ai besoin d'obtenir la sortie texte.
$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Pour être honnête, je ne veux pas jouer avec CURL car ce n'est pas vraiment le travail de CURL. Je ne veux pas non plus utiliser http_get car je n'ai pas les extensions PECL.
Fsockopen fonctionnerait-il? Si tel est le cas, comment faire cela sans lire le contenu du fichier? N'y a-t-il pas d'autre moyen?
Merci a tous
Mettre à jour
J'aurais dû ajouter, dans le premier cas, je ne veux pas attendre que le script retourne quoi que ce soit. Si je comprends bien, file_get_contents () attendra que la page se charge complètement, etc.?
la source
Réponses:
file_get_contents
fera ce que tu veuxEdit: Une façon de déclencher une demande GET et de revenir immédiatement.
Extrait de http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
Ce que cela fait est d'ouvrir un socket, de lancer une requête get, et de fermer immédiatement le socket et de revenir.
la source
curl_post_async
et obtenir même des votes positifs ...Voici comment faire fonctionner la réponse de Marquis avec les requêtes POST et GET:
la source
ssl://hostname
lieu de justehostname
.En ce qui concerne votre mise à jour, ne pas vouloir attendre le chargement de la page complète - je pense qu'une
HEAD
requête HTTP est ce que vous recherchez.get_headers devrait le faire - je pense qu'il ne demande que les en-têtes, donc ne sera pas envoyé le contenu de la page complète.
"PHP / Curl: HEAD Request prend beaucoup de temps sur certains sites" décrit comment faire une
HEAD
requête en utilisant PHP / CurlSi vous souhaitez déclencher la requête et ne pas retarder du tout le script, il existe plusieurs moyens, de complexité variable.
"wget -O /dev/null $carefully_escaped_url"
- ce sera spécifique à la plate-forme, et vous devez faire très attention à échapper les paramètres à la commandela source
Vous ne le faites pas. Bien que PHP offre de nombreuses façons d'appeler une URL, il n'offre pas de support prêt à l'emploi pour effectuer tout type de traitement asynchrone / threadé par cycle de requête / exécution. Toute méthode d'envoi d'une requête pour une URL (ou une instruction SQL, ou un etc.) va attendre une sorte de réponse. Vous aurez besoin d'une sorte de système secondaire fonctionnant sur la machine locale pour y parvenir (google around for "php job queue")
la source
Je vous recommanderais une bibliothèque PHP bien testée: curl-easy
la source
Si vous utilisez un environnement Linux, vous pouvez utiliser la commande exec de PHP pour invoquer linux curl. Voici un exemple de code, qui fera une publication HTTP asynchrone.
Ce code n'a pas besoin de bibliothèques PHP supplémentaires et il peut terminer la publication http en moins de 10 millisecondes.
la source
la source
getstatus()
ouwaitSend()
ouwaitResult()
. De cette façon, l'appelant peut obtenir un comportement totalement asynchrone en appelant dans une boucle pour vérifier s'il y a des résultats et, sinon, continuer sur toute autre tâche en cours d'exécution. Hmm, maintenant je veux porterTask
de .net à php…Problème intéressant. Je suppose que vous voulez simplement déclencher un processus ou une action sur l'autre serveur, mais ne vous souciez pas des résultats et que vous voulez que votre script continue. Il y a probablement quelque chose dans cURL qui peut rendre cela possible, mais vous pouvez envisager d'utiliser
exec()
pour exécuter un autre script sur le serveur qui effectue l'appel si cURL ne peut pas le faire. (En général, les gens veulent les résultats de l'appel de script, donc je ne suis pas sûr que PHP ait la capacité de simplement déclencher le processus.) Avec,exec()
vous pouvez exécuter unwget
ou même un autre script PHP qui fait la demande avecfile_get_conents()
.la source
Vous feriez mieux d'envisager d'utiliser Message Queues au lieu des méthodes conseillées. Je suis sûr que ce sera une meilleure solution, même si cela nécessite un peu plus de travail que l'envoi d'une simple demande.
la source
laissez-moi vous montrer mon chemin :)
nécessite que nodejs soit installé sur le serveur
(mon serveur envoie 1000 https get request ne prend que 2 secondes)
url.php:
urlscript.js>
la source
Pour moi, la question sur la demande GET asynchrone est apparue parce que j'ai rencontré une situation où je dois faire des centaines de demandes , obtenir et traiter des données de résultat à chaque demande et que chaque demande prend des millisecondes significatives d'exécution, ce qui conduit à des minutes (!) De exécution totale avec simple
file_get_contents
.Dans ce cas, c'était un commentaire très utile de w_haigh sur php.net sur la fonction http://php.net/manual/en/function.curl-multi-init.php
Alors, voici ma version améliorée et nettoyée de faire beaucoup de demandes simultanément. Pour mon cas, c'est équivalent à la manière "asynchrone". Peut-être que cela aide quelqu'un!
Il est facile de réécrire ceci pour gérer POST ou d'autres types de requêtes HTTP (S) ou toute combinaison de celles-ci. Et le support des cookies, les redirections, http-auth, etc.
la source
Essayer:
Cela ne fonctionnera PAS comme un module Apache, vous devez utiliser CGI.
la source
J'ai trouvé ce lien intéressant pour faire un traitement asynchrone (get request).
askapache
De plus, vous pouvez effectuer un traitement asynchrone en utilisant une file d'attente de messages comme par exemple beanstalkd.
la source
Voici une adaptation de la réponse acceptée pour effectuer une simple requête GET.
Une chose à noter si le serveur effectue une réécriture d'url, cela ne fonctionnera pas. Vous devrez utiliser un client http plus complet.
la source
Juste quelques corrections sur les scripts postés ci-dessus. Ce qui suit fonctionne pour moi
la source
Personne ne semble mentionner Guzzle , qui est un client HTTP PHP qui facilite l'envoi de requêtes HTTP. Cela peut fonctionner avec ou sans
Curl
. Il peut envoyer des requêtes synchrones et asynchrones.la source
Sur la base de ce fil, j'ai fait ceci pour mon projet codeigniter. Cela fonctionne très bien. Vous pouvez faire traiter n'importe quelle fonction en arrière-plan.
Un contrôleur qui accepte les appels asynchrones.
Et une bibliothèque qui fait les appels asynchrones
Cette méthode peut être appelée pour traiter n'importe quel model :: method () dans le 'background'. Il utilise des arguments variables.
la source
Suggestion: formatez une page HTML FRAMESET qui contient, disons, 9 cadres à l'intérieur. Chaque cadre obtiendra une "instance" différente de votre page myapp.php. Il y aura 9 threads différents en cours d'exécution sur le serveur Web, en parallèle.
la source
Pour PHP5.5 +, mpyw / co est la solution ultime. Cela fonctionne comme si c'était tj / co en JavaScript.
Exemple
Supposons que vous souhaitiez télécharger les avatars de plusieurs utilisateurs GitHub spécifiés. Les étapes suivantes sont requises pour chaque utilisateur.
<img class="avatar" src="...">
et demandez (GET IMAGE)---
: En attente de ma réponse...
: En attente d'une autre réponse dans des flux parallèlesDe nombreux
curl_multi
scripts basés célèbres nous fournissent déjà les flux suivants.Cependant, ce n'est pas assez efficace. Voulez-vous réduire les temps d'attente inutiles
...
?Oui, c'est très simple avec mpyw / co. Pour plus de détails, visitez la page du référentiel.
la source
Voici ma propre fonction PHP lorsque je fais un POST sur une URL spécifique de n'importe quelle page ...
Exemple: * utilisation de ma fonction ...
la source
Essayez ce code ...
N'oubliez pas d'activer l'extension php CURL.
la source
CURLOPT_TIMEOUT_MS
par exemple 100 millisecondes au lieu deCURLOPT_TIMEOUT
ce qui est en secondes et a un min de 1 seconde - pour une exécution plus rapide.Cela fonctionne bien pour moi, malheureusement, vous ne pouvez pas récupérer la réponse de votre demande:
Cela fonctionne très vite, pas besoin de sockets TCP bruts :)
la source