получить контент посланный через file_get_contents

Барби

Новичок
получить контент посланный через file_get_contents

день добрый!
задача - есть два скрипта на разных удалённых серверах. первый скрипт посылает запрос через file_get_contents. по идее эта функция может отправлять дополнительные данные на сервер:
PHP:
$doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
  <test>test1</test>
</request>
DOC;
$context = stream_context_create(array(
         'http' => array(
             'method'=>"POST",
             'header'=>"Content-type: application/xml\r\n" .
                       "Content-length: " . strlen($doc),
             'content'=>$doc
         )
     ));
     $response = file_get_contents('http://domain/share.php', true, $context);
вопрос заключается в том, как получить во втором скрипте то, что было отправлено контентом?

во втором скрипте делаю var_dump($_POST) и в респонзе первого появляется array(0) { }

попробовал сделать тоже самое через сокеты:
$eol = "\r\n";
$request_line = 'POST http://domain/share.php HTTP/1.0'.$eol.
'Host: domain'.$eol.
'Content-Type: x-www-form-urlencoded'.$eol.
'Content-Length: 11'.$eol.$eol.
'content=123';
$fp = fsockopen("domain", 80, $errno, $errstr, 30);
fwrite($fp, $request_line);
while (!feof($fp)) {
echo fgets($fp, 128);
}

получил тот же пустой POST, я так думаю что это нада копать где то в настройках пхп?
 

Фанат

oncle terrible
Команда форума
а без первого скрипта, просто браузером - работает?
 

Барби

Новичок
да.
второй переписан на
var_dump($_GET);

в браузере domain/share.php?test=1
вывод
array(1) { ["test"]=> string(1) "1" }

с формы тоже думаю будет всё получено, ибо смотрю всё на локалхосте, где в принципе не было проблем с получением данных из пост-форм
 

Beavis

Banned
а если в скрипте, который принимает данные, посмотреть в file_get_contents("php://input") ?
 

Барби

Новичок
посмотрел, отдал всё что нужно. для примера с сокетом вывод такой:
HTTP/1.1 200 OK Date: Sun, 15 Feb 2009 10:02:36 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.6 X-Powered-By: PHP/5.2.6 Content-Length: 25 Connection: close Content-Type: text/html string(11) "content=123"
 

Барби

Новичок
может я не правильно понял то, что ты просил сделать. вот скрипт
<?php
var_dump($_POST);
?>
<form method=post>
<input type=text name=test>
<input type=submit name=act value="go">
</form>

вывод после сабмита:
array(2) { ["test"]=> string(6) "123123" ["act"]=> string(2) "go" }
 

Барби

Новичок
наверное я чего то недопонял в третьем аргументе file_get_contents. я думал там просто передаются заголовки, а ф-ия stream_context_create просто строит заголовок запроса. всё не так?
 

Фанат

oncle terrible
Команда форума
не знаю, я ей не пользовался никогда.
просто перед тем, как посылать что-то скриптом, сначала надо послать браузером.
вот мне и интересно стало, как ты посылаешь application/xml

а потом стало смешно, что вместо поста с контент-тайпом ты послал гет вообще без него.

а еще было интересно, забыл об этом написать, как сервер будет искать у себя папку с названием http, когда ты делаешь через сокеты
 

Барби

Новичок
да нет, вроде как application/xml тут совсем непричём, посылается обычный пост запрос, с одной литерной переменной, похожей на xml : )

а по поводу сокетов, если ты про
$request_line = 'POST http://domain/share.php HTTP/1.0'
как то же находит : )) ошибку по крайней мере не выдаёт, а даже наоборот, как писал выше: HTTP/1.1 200 OK

данные из двух вариантов запроса можно успешно почитать в php://input, а вот в $_POSTе так и не получилось их застать

-~{}~ 15.02.09 17:10:

ой, пардон, наконец понял к чему ты про application/xml сейчас попробую что нибудь другое туды впихнуть

-~{}~ 15.02.09 17:15:

а вообще стоп... это код с file_get_contents взял из примера яндекса, думал на этом же принципе построить общение между двумя сайтами, которым нужно обмениваться информацией друг с дружкой, вот показалось что xml очень даже подходящий способ. если с тем кто посылает запрос понятно из примера, то как работает принимающая сторона осталось в тени. думал просто взять из поста этот xml в виде литерной переменной, но наверное же не зря этот заголовок application/xml. подскажите как его тогда вытащить да ещё и в виде DomDocument?
 

Фанат

oncle terrible
Команда форума
как то же находит
а не должен.
но наверное же не зря этот заголовок application/xml.
для яндекса, может, и не зря, а для обычного НТТР сервера сначала следует убедиться, что он понимает, что от него хочут.

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

Барби

Новичок
про сокеты, убрал http: $request_line = 'POST domain/share.php HTTP/1.0'.$eol
получил ответ: HTTP/1.1 400 Bad Request
 

Барби

Новичок
хорошо. ты говоришь надо убедится что сервер понимает то, чего от него хотят. непонятность для сервера может быть в Content-Type? я думаю что форма в браузере посылает text/html. попробовал это всунуть в контент-тайп, в _ПОСТ опять ничего
 

CHEM_Eugene

Новичок
Автор оригинала: Барби
подскажите как его тогда вытащить да ещё и в виде DomDocument?
Принимай так:
PHP:
$HTTP_RAW_POST_DATA = file_get_contents("php://input"); 
header("Content-type: text/plain");
echo $HTTP_RAW_POST_DATA;
Как domDocument получить думаю понятно

P.S.
Для отправки использовал твой скрипт:
PHP:
$doc = <<<DOC
<?xml version='1.0' encoding='utf-8'?>
<request>
  <test>test1</test>
</request>
DOC;
$context = stream_context_create(array(
         'http' => array(
             'method'=>"POST",
             'header'=>"Content-type: application/xml\r\n" .
                       "Content-length: " . strlen($doc),
             'content'=>$doc
         )
     ));
     $response = file_get_contents('http://test/1/receiver.php', true, $context);
echo $response;
 

Барби

Новичок
CHEM_Eugene
спасибо за код : ) правда Бивис в начале предлагал попробовать такой вариант. просто интереса ради решил выяснить почему в пост не ложится запрос
 

Барби

Новичок
*****
становитесь предсказуемым : )

-~{}~ 15.02.09 20:47:

скажи лучше почему на локалхосте работает, а выложил на площадку мастерхоста - скрипт чё та думает-думает, пока тайм-аут скрипта не выходит а ответа так и не получает с другой площадки того же мастерхоста? скрипт всё с тем же примером с file_get_contents. смотрел по ману - должно быть ini_set('allow_url_fopen', true);
на площадке php5.2.6
 

Фанат

oncle terrible
Команда форума
предсказуема не реакция, а тупость, с которой ты попадаешь пальцем в небо. надо не "думать", какой контент тайп, а посмотреть.

и с вопросом, почему у тебя "на площадке" не работает, обращайся к шаману. который, как и ты, тоже "думает".
а программисты не думают, они отлаживают программу.
в частности, они не только выставляют какую-нибудь настройку, но еще и проверяют - а имело ли это какой-то эффект.
и читают все сообщения об ошибках.
 
Сверху