2016-05-10 13 views
3

ローカルサーバlocalhostからデータを読み込むためにPHPを使用しようとしていますが、データが返されていないようです。ここに私の完全な脚本があります。ここでlocalhost(カスタムポート)は、POSTリクエスト後に空のデータを返します

<?php 
    $address = "localhost"; 
    echo "Attempting to open the socket at ".$address."...\n"; 
    $fp = fsockopen($address, 49801, $errno, $errstr, 10); 
    echo "Error number is "; echo $errno; echo ".\n"; 
    echo "Error string is ".$errstr.".\n"; 
    echo "Attempt complete.\n"; 
    if ($fp) { 
     print "Socket in now open.\n"; 
     syslog(LOG_INFO, "socket.php: Reaching the specified address..."); 
     print "Writing requests...\n"; //Hangs for about 1-2 minutes 
     fwrite($fp, "POST/HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\nHost: ".$address."Content-Type: text/xml\r\nContent-Length: ".strlen($payload)."\r\n\r\n"); 
     $msg = ""; 
     while($data = fread($fp, 32768)) { 
      $msg= $msg.$data; 
     } 
     if (strlen($msg) != 0) { 
      print "Final message: ***".$msg."***\n"; 
     } else { 
      print "There is no data received from '".$address."'\n"; 
     } 
    fclose($fp); 
    } else { 
    print "Error\n"; 
    } 
?> 

私は、端末に取得しています出力されます:

Attempting to open the socket at localhost... 
Error number is 0. 
Error string is . 
Attempt complete. 
Socket in now open. 
Writing requests... 
There is no data received from 'localhost' 

上記のスクリプトで述べたように、第2の最後の行は約1または2分間Writing requests...ハングは、空の文字列がされ添付。

このスクリプトはHTTPのポート80またはSSHのポート22でうまく動作するので、私はそれが好奇心だと思う。localhost:49801のアクセスを制限しているため、サーバーの設定を変更できない。

しかし、私は別の日のために私の髪を裂く必要がないように何かがサーバーの設定に間違っていたのだろうかと思っていた。

ところで、私はCentOSの7上にPHP 5.4を実行しています

編集
「111」、「コンテンツの長さ:111は、」ペイロードの文字列の長さに依存して任意の数です。

ありがとうございました!

+0

なぜだけではなく、標準のHTTPメソッドを使用します。以下は

は私がfwriteの使用して、データの9刺さを送るのContent-Lengthその後、

と9への変更の例を働いていますCソケットAPIで作業する代わりに? – miken32

+0

また、HTTPサーバーに111バイトの本体があると予想し、それから送信しないように指示しています。 – miken32

+0

ええと、私はあなたが "C socket API"の意味を理解しているかどうかわかりません。また、111がペイロードに応じて変わる任意の数であることを忘れています。投稿を更新します。 –

答えて

0

111バイトのデータを待っているため、サーバーからの返信がありません。

サーバーに適切な量のデータを送信すると、それに応じて応答します。

<?php 
    $address = "localhost"; 
    $payload = "Some data"; 
    echo "Attempting to open the socket at ".$address."...\n"; 
    $fp = fsockopen($address, 49801, $errno, $errstr, 10); 
    echo "Error number is "; echo $errno; echo ".\n"; 
    echo "Error string is ".$errstr.".\n"; 
    echo "Attempt complete.\n"; 
    if ($fp) { 
     print "Socket in now open.\n"; 
     syslog(LOG_INFO, "socket.php: Reaching the specified address..."); 
     print "Writing requests...\n"; 

     fwrite($fp, "POST/HTTP/1.0\r\nUser-Agent: PHP XMLRPC 1.0\r\nHost: ".$address. 
     "\r\nContent-Type: text/xml\r\nContent-Length: ". strlen($payload) ."\r\n\r\n"); 
     //We send the data to the server 
     fwrite($fp, $payload); 

     $msg = ""; 
     while($data = fread($fp, 32768)) { 
      $msg= $msg.$data; 
     } 
     if (strlen($msg) != 0) { 
      print "Final message: ***".$msg."***\n"; 
     } else { 
      print "There is no data received from '".$address."'\n"; 
     } 
    fclose($fp); 
    } else { 
    print "Error\n"; 
    } 
?> 
+0

ありがとうございます。私はちょうどターミナルでこのコードを試しましたが、実際のアプリケーションを実行すると(同じコードがありますが、あなたの例では111または9のような数字ではなく、常にstrlen($ payload)です0より大きい)、そうではありません:D。あなたは、サーバーが特定のサイズのデータ​​を期待しており、応答していないと思っていますか?もしそうなら、サーバーが期待しているデータのサイズを読む方法を見つけることは可能でしょうか?ありがとう –

+0

ああ、私の脳は非常に遅いです、私はstrlen( "いくつかのデータ")= 9、そう理解しています...しかし私はそれがstrlen($ payload)で動作しないということがかなり奇妙であることを知っています。これは以前のコメントで私が言ったことです。私は問題がサーバー側にあると思う。もしそうなら、私はあなたの答えを受け入れるでしょう。 –

+0

私はちょうどあなたのコメントを反映するために私の答えを変更します。私はそれを試してみると、それは働いているので、あなたの問題は本当に理解できません。上の例があなたのために働いているかどうか教えてください。そうでない場合は、何が間違っているかを確認するためにあなたが作業しているのとまったく同じコードが必要になります。 – Angel115

関連する問題