2010-03-02 18 views
9

que intento publicar datos utilizando fsockopen, y luego devolviendo el resultado. Aquí está mi código actual:datos PHP Mensaje con fsockopen

<?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); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 
?> 

Se supone hacerse eco de la página, y se hace eco de la página, pero aquí es el guión de script.php

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

El resultado es:

HTTP/1.1 200 OK Fecha: mar, 02 Mar 2010 22:40:46 GMT servidor: Apache/2.2.3 Desarrollado-X-Al (CentOS): PHP/5.2.6 Content-Length : 31 Conexión: cerrar Content-Type: text/html; charset = UTF-8 cadena (0) "" array()

¿Qué tengo mal? ¿Por qué la variable no publica sus datos?

+1

Deberías usar curl. – rook

+0

No puedo usar curl porque esto será de código abierto –

+1

"Curl es software libre y abierto" Curl está licenciado bajo la licencia MIT/X. – Xorlev

Respuesta

1

En ningún momento es $data de escribirse en el zócalo. Si desea añadir algo como:

$out .= "Connection: Close\r\n\r\n"; 
fwrite($fp, $out); 
fwrite($fp, $data); 
+0

Lo hice y todavía no hay cigarro. –

1

Prueba este lugar

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

No, no funciona, ¿se debe a que la conexión se ha cerrado? –

+0

No, intenté mantener vivo, todavía nada. Solo una matriz vacía –

+0

Intente instalar un analizador de paquetes en su servidor y vea qué encabezados se están enviando al servidor. ¿Son lo mismo que lo que estás enviando en php? –

-2

Es segura la utilización cURL y la opción?

+2

no, no lo es, lo siento. –

1

Prueba esto:

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

Algunos caracteres se escapa como \n no trabajan entre comillas simples.

16

hay muchos pequeños errores en su código. Aquí hay un fragmento que se prueba y funciona.

<?php 

$fp = fsockopen('example.com', 80); 

$vars = array(
    'hello' => 'world' 
); 
$content = http_build_query($vars); 

fwrite($fp, "POST /reposter.php HTTP/1.1\r\n"); 
fwrite($fp, "Host: example.com\r\n"); 
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n"); 
fwrite($fp, "Content-Length: ".strlen($content)."\r\n"); 
fwrite($fp, "Connection: close\r\n"); 
fwrite($fp, "\r\n"); 

fwrite($fp, $content); 

header('Content-type: text/plain'); 
while (!feof($fp)) { 
    echo fgets($fp, 1024); 
} 

Y luego, en example.com/reposter.php poner este

<?php print_r($_POST); 

Cuando ejecuta usted debe conseguir algo de salida como

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 
+0

¿Por qué aparece "1f" y "0" al final? Obtengo lo mismo, pero no estoy seguro. – carestad

+0

funciona pero tienes que cambiar en fsockopen a fsockopen ('www.example.com', 80); y en fwrite to fwrite ($ fp, "Host: www.example.com \ r \ n"); – Julian

0

uno de los buenos Tamlyn, funciona muy bien!

Para aquellos que también tienen que enviar vars get junto con la url,

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

Prueba esto en reposter.php

$raw_data = $GLOBALS['HTTP_RAW_POST_DATA']; 
parse_str($raw_data, $_POST); 

print_r($_POST); 

Porque, los datos no estaba en las variables, pero $_POST[] estaba en la variable $GLOBALS['HTTP_RAW_POST_DATA'].

-1

Curl es demasiado pesado en algunos casos, utilizar 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'); 

post para albergar la ubicación del proyecto php: http://code.google.com/p/post-to-host/

-2

Lo siento por refresco, pero para las personas que todavía tienen problema como este , cambie HTTP/1.0 a HTTP/1.1 y funcionará.

0

puede utilizar esta técnica que le ayudará a llamar tantas páginas como desee, todas las páginas se ejecutarán de forma independiente sin esperar a que cada respuesta de página sea asincrónica.

cornjobpage.php // MainPage

<?php 

post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue"); 
//post_async("http://localhost/projectname/testpage.php", "Keywordname=testValue2"); 
//post_async("http://localhost/projectname/otherpage.php", "Keywordname=anyValue"); 
//call as many as pages you like all pages will run at once independently without waiting for each page response as asynchronous. 
      ?> 
      <?php 

      /* 
      * Executes a PHP page asynchronously so the current page does not have to wait for it to  finish running. 
      * 
      */ 
      function post_async($url,$params) 
      { 

       $post_string = $params; 

       $parts=parse_url($url); 

       $fp = fsockopen($parts['host'], 
        isset($parts['port'])?$parts['port']:80, 
        $errno, $errstr, 30); 

       $out = "POST ".$parts['path']."?$post_string"." HTTP/1.1\r\n";//you can use GET instead of POST if you like 
       $out.= "Host: ".$parts['host']."\r\n"; 
       $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; 
       $out.= "Content-Length: ".strlen($post_string)."\r\n"; 
       $out.= "Connection: Close\r\n\r\n"; 
       fwrite($fp, $out); 
       fclose($fp); 
      } 
      ?> 

testpage.php

<? 
    echo $_REQUEST["Keywordname"];//case1 Output > testValue 
    ?> 

PD: si desea enviar parámetros de URL como bucle a continuación, siga esta respuesta: https://stackoverflow.com/a/41225209/6295712

Cuestiones relacionadas