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

#php #file-get-contents

#php #сессия #файлы 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']."rn"))`;
  

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

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

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

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

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

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

Комментарии:

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

Ответ №1:

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

 $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."rn"));
$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, воссоздайте точно такой же запрос запроса. Включите каждый заголовок, а не только файлы cookie.

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

Комментарии:

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

Ответ №2:

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

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

Пример:

 <?php
 $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."rn"));
 $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()

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

Комментарии:

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

2. Спасибо, мне приятно поделиться 😉

Ответ №3:

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

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

Ответ №4:

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