Я пытаюсь выполнить два действия с завихрением: 1. Войдите в админ-страницу 2. Отправьте форму (добавьте пользователя). Первая из них прекрасна, но вторая ошибка отображения не войдет в систему. Вот мой код:
$ch1 = curl_init(); $ch2 = curl_init(); curl_setopt($ch1, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" ); curl_setopt($ch1, CURLOPT_COOKIEJAR, "cookie.txt"); curl_setopt($ch1, CURLOPT_COOKIEFILE, "cookie.txt"); curl_setopt($ch1, CURLOPT_URL, "http://admin.example.com/admin"); curl_setopt($ch1, CURLOPT_POST, 1); curl_setopt($ch1, CURLOPT_POSTFIELDS, "user=admin&pass=password"); curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1); // allow redirects curl_setopt($ch1, CURLOPT_RETURNTRANSFER,1); // return into a variable curl_setopt($ch2, CURLOPT_URL, "http://admin.example.com/admin/adduser"); curl_setopt($ch2, CURLOPT_POST, 1); curl_setopt($ch2, CURLOPT_POSTFIELDS, "newu=demo&pass=password"); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, 1); $mh = curl_multi_init(); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); // execute all queries simultaneously, and continue when all are complete $running = null; do { curl_multi_exec($mh, $running); } while ($running); //close the handles curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Вы можете выполнить оба этих запроса, используя один и тот же дескриптор cURL. Проблема в использовании curl_multi_exec
в этом случае заключается в том, что каждый curl_multi_exec
с завихрением имеет разные параметры, а $ch2
не ссылается на файлы cookie.
Кроме того, curl_multi_exec
выполняет запросы параллельно, что означает, что вы можете попробовать добавить пользователя до того, как запрос на вход завершен или даже запущен.
Попробуйте это вместо этого, он иллюстрирует вход в систему с использованием $ch
, а затем снова использует его для добавления пользователя. Если сервер поддерживает keep-alive
, вы можете добавить заголовок keep-alive
и повторное использование такого же соединения сокета для второго запроса.
$ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" ); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); curl_setopt($ch, CURLOPT_URL, "http://admin.example.com/admin"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "user=admin&pass=password"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable $res = curl_exec($ch); // check $res here to see if login was successful curl_setopt($ch, CURLOPT_URL, "http://admin.example.com/admin/adduser"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "newu=demo&pass=password"); $res = curl_exec($ch); // check $res to see that the user was successfully created curl_close($ch);
Ниже приведены некоторые другие ответы, показывающие, как сделать несколько последовательных запросов на одном сайте с помощью cURL после входа в систему.
Войдите в Google с помощью PHP и Curl, Cookie отключился?
Извлечение Android Market mylibrary с завитком
PHP Curl – проблема с файлами cookie
Проблема заключается в том, что с помощью curl_multi
вы выполняете оба запроса одновременно. Запрос на отправку формы будет отправлен одновременно с запросом на вход, поэтому файлы cookie для входа еще не будут доступны.
Кроме того, вы не передаете файлы cookie в запрос формы вообще. Вы забыли сделать это:
curl_setopt($ch2, CURLOPT_COOKIEJAR, "cookie.txt"); curl_setopt($ch2, CURLOPT_COOKIEFILE, "cookie.txt");
Вы должны выполнить оба запроса отдельно, чтобы убедиться, что для запроса формы доступны правильные файлы cookie для входа.