11
votes

PHP Post Data avec Fsockopen

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 commentaires

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 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:


10 Réponses :


1
votes

à aucun moment est $ données étant écrit sur la prise. Vous voulez ajouter quelque chose comme: xxx


1 commentaires

J'ai fait ça et toujours pas de cigare.



1
votes

Essayez cela à la place

$out .= 'Content-Length: ' . strlen($data) . '\r\n';
$out .= "Connection: Close\r\n\r\n";
$out .= $data;


1 commentaires

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?



-2
votes

utilise Curl et option?


0 commentaires

1
votes

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);
}
?> 


0 commentaires

18
votes

Il y a beaucoup de petites erreurs dans votre code. Voici un extrait qui est testé et fonctionne. XXX PRE>

, 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


2 commentaires

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");



0
votes

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");


0 commentaires

0
votes

Essayez ceci dans repposter.php xxx

car, les données n'étaient pas dans le $ _ post [] variables mais c'était dans le $ Globals ['http_raw_post_data'] variable.


0 commentaires

-1
votes

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');


0 commentaires

-2
votes

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.


0 commentaires

0
votes

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.

cornjobpage.php // mainpage xxx

testpage.php xxx

ps: Si vous souhaitez envoyer des paramètres URL En tant que boucle, suivez cette réponse: https://stackoverflow.com/a/41225209/6295712


0 commentaires