Как отправлять файлы cookie с помощью file_get_contents

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

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

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

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

Я получаю содержимое с помощью:

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

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

Warning: file_get_contents(http://www.example.com/test1.php) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

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

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

К вашему сведению - если вы используете A2hosting, вам необходимо запросить доступ к fopen (они закрывают его по умолчанию из соображений безопасности)

user411319 05.08.2010 01:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
1
25 966
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Ответ принят как подходящий

Во-первых, это, вероятно, просто опечатка в вашем вопросе, но третьим аргументом 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 (для этого подходит командная строка curl). Вполне возможно, что данная страница может нормально загружаться в браузере без cookie, но когда вы отправляете cookie, сайт фактически возвращает 404.

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

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

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

При использовании этого кода я получаю сообщение об ошибке «Ошибка заголовка HTML», поэтому мне нужно найти решение, добавив «session_write_close ();» перед file_get_contents. Это правильный способ?

Keyur Mistry 11.05.2016 14:37

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

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

Просто чтобы поделиться этой информацией. При использовании session_start() файл сеанса блокируется PHP. Таким образом, фактический сценарий - единственный сценарий, который может получить доступ к файлу сеанса. Если вы попытаетесь получить к нему доступ через 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() является блокирующей функцией, оба сценария не будут работать в параллельном режиме при попытке изменить файл сеанса.

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

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

Дай мне знать, если найдешь что-нибудь получше.

Большое спасибо за публикацию этого сообщения :) Хотел бы я дать больше голосов, потому что вы только что спасли меня от выдергивания всех моих волос.

P. Galbraith 25.10.2012 07:35

Спасибо, мне приятно поделиться;)

Yves Lange 21.04.2016 09:25

Другие вопросы по теме