Я пытаюсь получить содержимое из другого файла с 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.domain.com/test1.php", false, $opts);
Но теперь я получаю сообщение об ошибке:
Предупреждение: file_get_contents ( http://www.domain.com/test1.php ) [function.file-get-contents]: не удалось открыть поток: HTTP-запрос не удался! HTTP / 1.1 404 не найден
Кто-нибудь знает, что я здесь разворачиваю?
edit: забыл упомянуть: без streaming_context страница просто загружается. Но с печеньем я не получаю информацию, в которой я нуждаюсь.
Во-первых, это, вероятно, только опечатка в вашем вопросе, но третий аргумент 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 существует по какой-то причине. Если это вообще возможно (я не прошу!), Используйте его вместо этого. 🙂
Просто чтобы поделиться этой информацией. При использовании 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()
является блокирующей функцией, оба сценария не будут в параллелизме при попытке изменить файл сеанса.
Но я уверен, что это не лучший способ манипулировать сеансом с расширенным соединением.
Btw: это быстрее, чем cURL и fsockopen()
Дайте мне знать, если вы найдете что-то лучше.
Просто из любопытства вы пытаетесь file_get_contents
на странице, в которой есть пробел? Я помню, как пытался использовать fgc по URL-адресу, в котором было место в названии, и, хотя мой веб-браузер разбирал его просто отлично, fgc этого не делал. Мне пришлось использовать str_replace
для замены '' на '% 20'.
Я бы подумал, что это было бы относительно легко заметить, хотя, поскольку оно сообщило бы только о половине имени файла. Кроме того, я заметил, что в одном из этих сообщений кто-то использовал \ r \ n при определении заголовков. Имейте в виду, что PHP не любит, чтобы они были в одинарных кавычках, но они отлично работают в двух вариантах.
Убедитесь, что файл file.php существует на сервере. Попробуйте открыть его в своем браузере, чтобы убедиться!