2016-05-10 2 views
3

Я пытаюсь использовать PHP для чтения данных с локального сервера localhost, но, похоже, от него не возвращаются данные. Вот мой полный сценарий.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' 

Как упоминалось в приведенном выше сценарии, то вторая последняя строка Writing requests... висит около 1 или 2 минут, затем пустая строка прилагается.

Я думаю, что это довольно любопытно, потому что этот скрипт хорошо работает на HTTP-порту 80 или на порту SSH 22. У меня ограничен доступ к конфигурации localhost:49801 и, следовательно, я не могу вносить какие-либо изменения в конфигурацию сервера.

Мне было интересно, что-то не так с конфигурацией сервера, так что мне не нужно вырывать волосы еще на один день.

Кстати, я бегу PHP 5.4 на CentOS 7.

Edit
'111' в "Content-Length: 111" представляет собой произвольное число, которое зависит от длины строки полезной нагрузки в.

Спасибо, что вам нужна помощь!

+0

Почему бы не использовать стандартные методы HTTP вместо работы с API-интерфейсами сокетов? – miken32

+0

Кроме того, вы говорите, что HTTP-сервер ожидает 111-байтовый корпус, но затем не отправляет его. – miken32

+0

Хмм, я не уверен, что понимаю, что вы подразумеваете под «API-интерфейсом сокетов», также я забыл упомянуть, что 111 - это просто произвольное число, которое варьируется в зависимости от полезной нагрузки. Я обновлю сообщение. –

ответ

0

У вас нет ответа с вашего сервера, потому что он ждет от вас 111 байтов данных.

если вы отправляете нужное количество данных на ваш сервер, он ответит соответствующим образом.

Ниже работает пример, когда я изменить Content-Length до 9

, а затем я посылаю 9 укусы данных с использованием FWRITE:

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

Смежные вопросы