Не удается отправить куки с file_get_contents - PullRequest
14 голосов
/ 20 ноября 2008

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

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

Чтобы отправить куки с file_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 Not Found

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

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

Ответы [ 4 ]

29 голосов
/ 21 ноября 2008

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

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

12 голосов
/ 01 марта 2012

Просто чтобы поделиться этой информацией. При использовании 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()

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

1 голос
/ 12 июня 2010

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

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

0 голосов
/ 20 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...