Je tente de poster des données à l'aide de Fsockopen, puis de renvoyer le résultat. Voici mon code actuel:
<?php echo "<br><br>"; $raw_data = $GLOBALS['HTTP_RAW_POST_DATA']; parse_str( $raw_data, $_POST ); //test 1 var_dump($raw_data); echo "<br><br>": //test 2 print_r( $_POST ); ?>
10 Réponses :
à aucun moment est $ données code> étant écrit sur la prise. Vous voulez ajouter quelque chose comme:
J'ai fait ça et toujours pas de cigare.
Essayez cela à la place
$out .= 'Content-Length: ' . strlen($data) . '\r\n'; $out .= "Connection: Close\r\n\r\n"; $out .= $data;
Essayez d'installer un sniffer de paquet sur votre serveur et voyez quels en-tête sont en cours d'envoi au serveur. Sont-ils les mêmes que ce que vous envoyez en PHP?
Essayez ceci:
<?php $data="stuff=hoorah\r\n"; $data=urlencode($data); $fp = fsockopen("www.website.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "POST /script.php HTTP/1.0\r\n"; $out .= "Host: www.webste.com\r\n"; $out .= "Content-Type: application/x-www-form-urlencoded\r\n"; $out .= 'Content-Length: ' . strlen($data) . "\r\n\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); fwrite($fp, $data); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } ?>
Il y a beaucoup de petites erreurs dans votre code. Voici un extrait qui est testé et fonctionne. , puis sur exemple.com/reposter.php Mettez ce P> HTTP/1.1 200 OK
Date: Wed, 05 Jan 2011 21:24:07 GMT
Server: Apache
X-Powered-By: PHP/5.2.9
Vary: Host
Content-Type: text/html
Connection: close
1f
Array
(
[hello] => world
)
0
Pourquoi montrez-vous «1f» et «0» à la fin là-bas? Je reçois la même chose, mais pas tout à fait sûr.
Cela fonctionne, mais vous devez changer de fsockopen vers FSOCKOPEN ('www.example.com', 80); et en fwrite to fwrite ($ PF, "hôte: www.example.com \ r \ n");
Nice One Tamlyn, fonctionne bien!
Pour ceux qui doivent également envoyer des varès avec l'URL, P>
//change this: fwrite($fp, "POST /reposter.php HTTP/1.1\r\n"); //to: $query = 'a=1&b=2'; fwrite($fp, "POST /reposter.php?".$query." HTTP/1.1\r\n");
Essayez ceci dans repposter.php car, les données n'étaient pas dans le $ _ post [] code> variables mais c'était dans le
$ Globals ['http_raw_post_data'] code> variable. P> p>
CURL est trop lourd dans certains cas, pour utiliser POST_TO_HOST ():
//GET: $str_rtn=post_to_host($str_url_target, array(), $arr_cookie, $str_url_referer, $ref_arr_head, 0); //POST: $arr_params=array('para1'=>'...', 'para2'=>'...'); $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head); //POST with file: $arr_params=array('para1'=>'...', 'FILE:para2'=>'/tmp/test.jpg', 'para3'=>'...'); $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 2); //raw POST: $tmp=array_search('uri', @array_flip(stream_get_meta_data($GLOBALS[mt_rand()]=tmpfile()))); $arr_params=array('para1'=>'...', 'para2'=>'...'); file_put_contents($tmp, json_encode($arr_params)); $arr_params=array($tmp); $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 3); //get cookie and merge cookies: $arr_new_cookie=get_cookies_from_heads($ref_arr_head)+$arr_old_cookie;//don't change the order //get redirect url: $str_url_redirect=get_from_heads($ref_arr_head, 'Location');
Désolé pour rafraîchir, mais pour les personnes qui ont toujours un problème comme ceci, changez http / 1.0 en http / 1.1 et cela fonctionnera. p>
Vous pouvez utiliser cette technique, il vous aidera à appeler autant que les pages que vous aimez que toutes les pages s'exécuteront de manière indépendante sans attendre chaque réponse de page comme asynchrone.
ps: Si vous souhaitez envoyer des paramètres URL En tant que boucle, suivez cette réponse: https://stackoverflow.com/a/41225209/6295712 p> p>
Je ne peux pas utiliser Curl car ce sera open source
"CURL est logiciel gratuit et ouvert" CURL est sous licence de licence MIT / X.
vous ne pouvez pas vous attendre à tout le monde (même les personnes avec hébergement partagé) de vouloir et d'obtenir courbure
Je pourrais avoir tort à ce sujet, mais il ne faut-il pas y avoir un \ r \ n après chacun des champs d'en-tête? À l'exception du dernier cours ...
Ne devrait-il pas «être« \ r \ n »? Est-ce que ces choses s'échappent des choses dans des citations simples
J'ai tenté à la fois, encore rien.
Avez-vous
toujours_populat_raw_post_data code> activé? PHP.net/Manual/ EN / ...
C'était éteint, allumez-le maintenant pour voir si cela fonctionne.
Si vous ne pouvez pas utiliser de binaires CURL, vous pouvez essayer PURL, une implémentation PHP pure de curl.
Vous avez seulement le double \ r \ n après le dernier en-tête. Vous l'avez deux fois, après la longueur de contenu: et la connexion: