несколько действий с завитком - PullRequest
3 голосов
/ 04 марта 2012

Я пытаюсь выполнить два действия с помощью curl: 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);

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

Вы можете выполнить оба этих запроса, используя один и тот же дескриптор cURL. Проблема в использовании 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 отключен?
Извлечение mylibrary с Android Market с помощью скручивания
PHP Curl - проблема с файлами cookie

0 голосов
/ 04 марта 2012

Проблема в том, что при использовании curl_multi вы выполняете оба запроса одновременно. Запрос на отправку формы будет отправлен одновременно с запросом на вход, поэтому файлы cookie для входа еще не будут доступны.

Кроме того, вы вообще не передаете файлы cookie в запрос формы. Вы забыли сделать это:

curl_setopt($ch2, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch2, CURLOPT_COOKIEFILE, "cookie.txt");

Вы должны выполнить оба запроса по отдельности, чтобы обеспечить наличие надлежащих файлов cookie для входа в систему для запроса формы.

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