Не удалось отправить файлы cookie с файлом_get_contents

Я пытаюсь получить содержимое из другого файла с файлом_get_contents (не спрашивайте почему). У меня есть два файла: test1.php и test2.php. Test1.php возвращает строку, основываясь на пользователе, который вошел в систему.

Test2.php пытается получить содержимое test1.php и выполняется браузером, получая файлы cookie.

Чтобы отправить файлы cookie с файлом_get_contents, я создаю потоковый контекст:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`;

Я возвращаю содержимое с помощью:

$contents = file_get_contents("http://www.domain.com/test1.php", false, $opts);

Но теперь я получаю ошибку:

Предупреждение: file_get_contents (http://www.domain.com/test1.php) [function.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP/1.1 404 не найден

Кто-нибудь знает, что я здесь делаю?

изменить: забыл упомянуть: без streaming_context страница просто загружается. Но с печеньем я не получаю информацию, в которой я нуждаюсь.

Ответ 1

Во-первых, это, вероятно, только опечатка в вашем вопросе, но третий аргумент file_get_contents() должен быть вашим потоковым контекстом, а не массивом опций. Я провел быстрый тест с чем-то вроде этого, и все работало как ожидалось

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
$context = stream_context_create($opts);
$contents = file_get_contents('http://example.com/test1.txt', false, $context);
echo $contents;

Ошибка указывает, что сервер возвращает 404. Попробуйте извлечь URL с компьютера, на котором работает PHP, и не с вашей рабочей станции/рабочего стола/ноутбука. Возможно, ваш веб-сервер испытывает проблемы с доступом к сайту, на вашем локальном компьютере есть кешированная копия или какая-либо другая сетевая зависть.

Обязательно повторите свой точный запрос при запуске этого теста, включая отправляемый файл cookie (для этого подходит завиток командной строки). Вполне возможно, что эта страница может загружаться в браузере без cookie, но когда вы отправляете файл cookie, на самом деле сайт возвращает 404.

Убедитесь, что $_SERVER ['HTTP_COOKIE'] имеет исходный файл cookie, который, как вы думаете, он делает.

Если вы очищаете экран, загрузите Firefox и копию расширения LiveHTTPHeaders. Выполните все необходимые шаги для доступа к любой странице, которую вы хотите в Firefox. Затем, используя вывод LiveHTTPHeaders, воссоздайте ту же самую просьбу о запросе. Включите каждый заголовок, не только файлы cookie.

Наконец, PHP Curl существует по какой-то причине. Если это вообще возможно (я не прошу!), Используйте его вместо этого.:)

Ответ 2

Просто чтобы поделиться этой информацией. При использовании session_start() файл сеанса блокируется PHP. Таким образом, фактический script является единственным script, который может получить доступ к файлу сеанса. Если вы попытаетесь получить к нему доступ через fsockopen() или file_get_contents(), вы можете долго ждать, пока пытаетесь открыть заблокированный файл.

Один из способов решить эту проблему - использовать session_write_close(), чтобы разблокировать файл и после этого перезагрузить его с помощью session_start().

Пример:

<?php
 $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
 $context = stream_context_create($opts);
 session_write_close(); // unlock the file
 $contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context);
 session_start(); // Lock the file
 echo $contents;
?>

Поскольку file_get_contents() является блокирующей функцией, оба script не будут в concurrency при попытке изменить файл сеанса.

Но я уверен, что это не лучший способ манипулировать сеансом с расширением соединения.

Btw: это быстрее, чем cURL и fsockopen()

Сообщите мне, если вы найдете что-то лучшее.

Ответ 3

Просто из любопытства вы пытаетесь file_get_contents на странице, в которой есть пробел? Я помню, как пытался использовать fgc по URL-адресу, в котором было место в названии, и, хотя мой веб-браузер разбирал его просто отлично, fgc этого не делал. В итоге мне пришлось использовать str_replace для замены '' на "%20".

Я бы подумал, что это было бы относительно легко заметить, хотя, поскольку он будет сообщать только о половине имени файла. Кроме того, я заметил, что в одном из этих сообщений кто-то использовал \r\n при определении заголовков. Имейте в виду, что PHP не любит, чтобы они были в одинарных кавычках, но они отлично работают в двойном режиме.

Ответ 4

Убедитесь, что файл file.php существует на сервере. Попробуйте открыть его в своем браузере, чтобы убедиться!