Не удалось отправить файлы 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 существует на сервере. Попробуйте открыть его в своем браузере, чтобы убедиться!