Як публікувати дані в PHP за допомогою file_get_contents?


299

Я використовую функцію PHP file_get_contents()для отримання вмісту URL-адреси, а потім обробляю заголовки через змінну $http_response_header.

Тепер проблема полягає в тому, що для деяких з них потрібні деякі дані для розміщення в URL-адресі (наприклад, сторінки для входу).

Як це зробити?

Я усвідомлюю, що за допомогою stream_context я можу це зробити, але мені це не зовсім зрозуміло.

Дякую.



8
Це повинно бути відхилено нескінченно. Немає жодних причин використовувати Curl / Guzzle або будь-яку іншу фантазійну бібліотеку, якщо у вас є функціональний PHP, який виконує цю роботу.
Омар Абід

Відповіді:


589

Надіслати HTTP POST-запит з використанням file_get_contentsне так вже й важко: як ви здогадалися, ви повинні використовувати $contextпараметр.


На цій сторінці є приклад, наведений у посібнику з PHP: Параметри контексту HTTP (цитування) :

$postdata = http_build_query(
    array(
        'var1' => 'some content',
        'var2' => 'doh'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://example.com/submit.php', false, $context);

В основному, вам потрібно створити потік з правильними параметрами (на цій сторінці є повний список) і використовувати його як третій параметр для file_get_contents- нічого більше ;-)


Як сторонне позначення: загалом кажучи, для надсилання запитів HTTP POST ми схильні використовувати curl, який надає безліч варіантів всіх - але потоки - це одна з приємних речей PHP, про які ніхто не знає ... занадто погано .. .


1
Дякую. Я здогадуюсь, що я можу вставити вміст з $ _POST у $ postdata, якщо мені потрібно передати ті самі параметри POST на потрібну сторінку?
Парас Чопра

6
Я гадаю, ви можете зробити щось подібне; але contentне повинно бути PHP масив: він повинен бути QueryString (тобто він повинен має такий вигляд: param1=value1&param2=value2&param3=value3) ;; а це означає, що вам, мабуть, доведеться скористатисяhttp_build_query($_POST)
Pascal MARTIN

2
Чудово! Я шукав спосіб передати дані POST на іншу сторінку, досяжної діяльності $postdata = http_build_query($_POST).
Ліам Ньюмарш

1
досить цікаво, це не працює для мене взагалі, я пробував це протягом декількох годин, і всі мої запити перетворюються на отримання querys
WojonsTech

1
Для відправки кілька значень заголовків, киньте їх все в один рядок з \r\nпереносами рядки - см: stackoverflow.com/a/2107792/404960
rymo

20

В якості альтернативи ви також можете використовувати fopen

$params = array('http' => array(
    'method' => 'POST',
    'content' => 'toto=1&tata=2'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if (!$fp)
{
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if ($response === false) 
{
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

Чомусь це працювало для мене, але офіційний приклад PHP цього не робив. +1 toto=1&tata=2також. Я не використовував fopen, однак.
Михайло Яворський

4
@ Ġiĺàɗ Ми тут не називаємо людей "noob". Це дружнє попередження проти таких.
Дедал

0
$sUrl = 'http://www.linktopage.com/login/';
$params = array('http' => array(
    'method'  => 'POST',
    'content' => 'username=admin195&password=d123456789'
));

$ctx = stream_context_create($params);
$fp = @fopen($sUrl, 'rb', false, $ctx);
if(!$fp) {
    throw new Exception("Problem with $sUrl, $php_errormsg");
}

$response = @stream_get_contents($fp);
if($response === false) {
    throw new Exception("Problem reading data from $sUrl, $php_errormsg");
}

2
Спробуйте надати детальну відповідь, а не просто копіювати / вставляти код.
Феліпе Лео

1
Також це зайво ускладнюється. Ви можете використовувати file_get_contentsзамість fopen+ stream_get_contents. І ви навіть не закриваєте "файл". Дивіться прийняту відповідь від @PascalMARTIN.
Мартін Прикрил
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.