php – 使用POST的异步cURL
发布时间:2020-12-13 17:42:43 所属栏目:PHP教程 来源:网络整理
导读:我正在制作一个命令行应用程序.在执行登录过程后,我需要同时通过cURL发出多个POST请求 – 这意味着传出请求必须发送会话ID等. 事件链如下: 我用curl_init打开cURL连接 我使用curl_exec登录远程站点发送POST请求,并获得返回的HTML代码作为响应 我同时向同一
我正在制作一个命令行应用程序.在执行登录过程后,我需要同时通过cURL发出多个POST请求 – 这意味着传出请求必须发送会话ID等.
事件链如下: >我用curl_init打开cURL连接 我在考虑使用类似的东西: // Init connection $ch = curl_init(); // Set curl options curl_setopt($ch,CURLOPT_COOKIEJAR,'cookies.txt'); curl_setopt($ch,CURLOPT_COOKIEFILE,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,CURLOPT_POST,1); // Perform login curl_setopt($ch,CURLOPT_URL,"http://www.mysite/login.php"); $post = array('username' => 'username','password' => 'password'); curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($post)); $result = curl_exec($ch); // Send multiple requests after being logged on curl_setopt($ch,CURLOPT_TIMEOUT_MS,1); for($i = 0 ; $i < 10 ; $i++){ $post = array('myvar' => 'changing_value'); curl_setopt($ch,'www.myweb.ee/changing_url'); curl_setopt($ch,http_build_query($post)); curl_exec($ch); } 但这似乎不起作用,因为只有循环中的第一个请求似乎被发送. 使用curl_multi_init可能是一个解决方案,但我不知道我是否可以多次传递相同的cURL句柄,每个都有更改的选项. 对于那些同时发出的请求,我不需要服务器的任何响应,但如果它也可以以某种方式完成,那将是很棒的. 如果有人能够把我推向正确的方向,那将是完美的. 解决方法
您需要为每个请求创建一个新的curl句柄,然后将其注册到
http://www.php.net/manual/en/function.curl-multi-add-handle.php
这里有一些我从我的代码库中删除并改编的代码,请记住你应该在那里添加错误检查. function CreateHandle($url,$data) { $curlHandle = curl_init($url); $defaultOptions = array ( CURLOPT_COOKIEJAR => 'cookies.txt',CURLOPT_COOKIEFILE => 'cookies.txt',CURLOPT_ENCODING => "gzip",CURLOPT_FOLLOWLOCATION => true,CURLOPT_RETURNTRANSFER => true,CURLOPT_POST => 1,CURLOPT_POSTFIELDS => $data ); curl_setopt_array($curlHandle,$defaultOptions); return $curlHandle; } function MultiRequests($urls,$data) { $curlMultiHandle = curl_multi_init(); $curlHandles = array(); $responses = array(); foreach($urls as $id => $url) { $curlHandles[$id] = CreateHandle($url,$data[$id]); curl_multi_add_handle($curlMultiHandle,$curlHandles[$id]); } $running = null; do { curl_multi_exec($curlMultiHandle,$running); } while($running > 0); foreach($curlHandles as $id => $handle) { $responses[$id] = curl_multi_getcontent($handle); curl_multi_remove_handle($curlMultiHandle,$handle); } curl_multi_close($curlMultiHandle); return $responses; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |