2012-03-19 21 views
0

私はfsockopenを使用してデータを接続し、スクリプトに送信しています。問題は、下の出力でわかるように受信側でデータが受信されないことです。空の配列だけが出力されます。私はTamlynsの回答に基づいてここに答えました:PHP Post data with Fsockopen。私は 'ポストパラメータを作成する彼の方法を試しました、出力の違いはありません。fsockopenでデータを送信すると、受信側でデータが受信されない

私の主なスクリプト:

<?php 
session_start(); 

    $fp = fsockopen("192.168.1.107",  
      80, 
      $errno, $errstr, 10);  

    $params = "smtp=posteddata\r\n"; 
    $params = urlencode($params); 

    $auth = base64_encode("kaand:kaand123"); 

    if (!$fp) { 
      return false; 
     } else { 
      error_log("4"); 
      $out = "POST /smic/testarea/fsockopen_print_post.php HTTP/1.1\r\n";  
      $out.= "Host: 192.168.1.107\r\n";  
      $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; 
      $out.= "Authorization: Basic ".$auth; 
      $out.= 'Content-Length: '.strlen($params).'\r\n'; 
      $out.= "Connection: Close\r\n\r\n"; 
      $out .= $params; 

      fwrite($fp, $out); 
      fflush($fp); 

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

      fclose($fp); 
     }   
?> 

fsockopen_print_post.php:

<?php 
session_start(); 

print_r($_POST); 

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

出力:

HTTP/1.1 200 OK 
Date: Mon, 19 Mar 2012 09:21:06 GMT 
Server: Apache/2.2.15 (CentOS) 
X-Powered-By: PHP/5.3.10 
Set-Cookie: PHPSESSID=i4lcj5mn1ablqgekb1g24ckbg5; path=/ 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 20 
Connection: close 
Content-Type: text/html; charset=UTF-8 

Array 
(
) 
Array 
(
) 

何問題はどのように修正するのですか?

答えて

1

あなたのコードにタイプミスがあります:

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

は次のようになります。

$out .= "Content-Length: ".strlen($params)."\r\n"; 
$out .= "Connection: close\r\n\r\n"; 

あなたは\r\n周りの単一引用符を使用しましたどのように参照してください?これは、これらをWindows crlfと解釈するのではなく、そのまま'\r\n'を送信することを意味します。二重引用符はこれを修正します。

+0

ご回答ありがとうございます。これは本当に必要ですか? fsockopenの例を見てみると、このようなことはしません([php.net](http://se2.php.net/manual/en/function.fsockopen.php))、私が見つけた他の例これはどこにも使われていません。私はちょうど、データを投稿して切断する(非同期の方法で)する必要があります。 – Nicsoft

+0

複数のクライアントをブロックせずに処理できるようにする必要がある場合は必要です。あなたが「知っている」なら、あなたはただ一つしか必要としません。これは今あなたがしていることを意味しますが、将来はより多くを必要とすることを意味します。しかし、私は、この方法でソリューションを実装することをお勧めします。さらに、あなたは何も失わないように立っていますが、これがどのように機能するかを理解すると、より良い知識を得ることができます。 ;) – deed02392

+0

学習曲線は今のところかなり急です;)これは複数のクライアントの処理に役立ちますが、これは受信したデータを私が求めているものにするのに役立ちますか? – Nicsoft

0

この行

$out.= "Authorization: Basic ".$auth; 

$out.= "Authorization: Basic ".$auth."\r\n"; 

されている必要があり、私が特定されていませんが、このコードが動作する他の何か(周りにテストするときにおそらくいくつかの変数のアップミキシング)がありました:

<?php 
$fp = fsockopen('192.168.1.107', 80); 
$vars = array(
'hello' => 'world' 
); 
$content = http_build_query($vars); 
$auth = base64_encode("kaand:kaand123"); 
$out = "POST /smic/testarea/fsockopen_print_post.php HTTP/1.1\r\n";  
$out .= "Host: 192.168.1.107\r\n";  
$out .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$out .= "Authorization: Basic ".$auth."\r\n"; 
$out .= "Content-Length: ".strlen($content)."\r\n"; 
$out .= "Connection: close\r\n\r\n"; 
$out .= $content; 

fwrite($fp,$out); 

header("Content-type: text/plain"); 
while (!feof($fp)) { 
echo fgets($fp, 1024); 
} 
fclose($fp);  
?> 
関連する問題