LINUX.ORG.RU

Stream context не передает POST

 


0

3

Картина такая:

Сценарий php на сервере A принимает переменные, переданные методом POST, и определенным образом реагирует на это.

Сервер B передает переменные с помощью кода, приведенного ниже, и сервер A обрабатывает их.

Сервер C передает переменные с помощью кода, приведенного ниже, но на сервере A массив $_POST не создается вообще.

В чем может быть проблема? Подозреваю настройки PHP на сервере C, но какие — ненагугливается.

//Упрощено:

$this -> data = array ('var' => 'val');
$this -> options = array ('http' => array ());
$this -> options ['http']['method'] = 'POST';
$this -> options ['http']['header'] = 'Content-type: application/x-www-form-urlencoded';
$this -> options ['http']['content'] = http_build_query ($this -> data);
$context = stream_context_create ($this -> options);
copy ($this -> url, $fname, $context);
★★

Последнее исправление: metrokto (всего исправлений: 3)

Уже трое подписано и тишина...

А ведь у меня такое было. Мучительно пытаюсь вспомнить почему и не могу :(

Suntechnic ★★★★★
()

1) Из твоего исходника запрос ничто не отправляет, можно дописать

file_get_contents('127.0.0.1', false, $context);
RTFM

2) После конца даты по http протоколу должен быть перенос каретки и строки (\r\n).

3) Зайди уже в wireshark, посмотри что отправляешь\получаешь + var_dump() наше все.

oskar0609
()
Ответ на: комментарий от oskar0609

Из твоего исходника запрос ничто не отправляет, можно дописать

Отправляет. Все, кроме POST с сервера C.

file_get_contents ... RTFM

RTFM

После конца даты по http протоколу должен быть перенос каретки и строки (\r\n).

PHP настолько любезен, что может делать это сам.

wireshark

Хостинг.

var_dump() наше все

Array
(
    [HTTP_HOST] => хост
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => <address>Apache/2.2.16 (Debian) Server at хост Port порт</address>

    [SERVER_SOFTWARE] => Apache/2.2.16 (Debian)
    [SERVER_NAME] => хост
    [SERVER_ADDR] => адрес
    [SERVER_PORT] => порт
    [REMOTE_HOST] => хост
    [REMOTE_ADDR] => адрес
    [DOCUMENT_ROOT] => /var/www/RS/www
    [SERVER_ADMIN] => [no address given]
    [SCRIPT_FILENAME] => /var/www/RS/www/items/get/updates.php
    [REMOTE_PORT] => 42307
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.0
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /items/get/updates.php
    [SCRIPT_NAME] => /items/get/updates.php
    [PHP_SELF] => /items/get/updates.php
    [REQUEST_TIME] => 1374649949
    [argv] => Array
        (
        )

    [argc] => 0
)
metrokto ★★
() автор топика

Причину проблемы открыли исходники PHP.

Несмотря на то, что поддержка контекста для функции copy заявлена с 5.3, в версии 5.3.3 (как на сервере C), функция принимает, но не использует его:

/* PHP 5.3.3 и 5.5.1 */
char *source, *target;
int source_len, target_len;
zval *zcontext = NULL;
php_stream_context *context;


/* PHP 5.5.1 */
if (php_copy_file_ctx(source, target, 0, context TSRMLS_CC) == SUCCESS)

/* PHP 5.3.3 */
if (php_copy_file(source, target TSRMLS_CC) == SUCCESS)
metrokto ★★
() автор топика
Ответ на: комментарий от metrokto

Вдруг кому пригодится...

function _copy (string $source, string $dest, resource $context = null, $f_g_c_flags = false)
{
    if (is_null ($context))
        return copy ($source, $dest);

    if (version_compare (PHP_VERSION, '5.4', '>='))
        return copy ($source, $dest, $context);

    $contents = file_get_contents ($source, $f_g_c_flags, $context);
    if ($contents === false)
        return false;

    return file_put_contents ($dest, $contents, LOCK_EX) !== false;
}
metrokto ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.