Есть скрипт. Он берет массив из ссылок с уже установленными для этих ссылок прокси и паролями. Идет по ссылкам, вытаскивает контент. При определенных условиях (зависит от полученного ответа), для некоторых ссылок нужно сделать дополнительный запрос через curl, с использованием уже имеющейся сессии для определенного прокси.
public function step1() {
$multi = curl_multi_init();
$channels = array();
foreach ($urlsWithProxies as $k=>$v) {
$ch = curl_init();
$url = $v['url']; //Урл
$proxy = $v['proxyname']; //Прокси:порт
$pass = $v['proxypass']; //логин:пароль прокси
$file = dirname(__FILE__)."/cookies/".$proxy.".txt"; //Будем хранить куки в этом файле
file_put_contents($file, null); //Очищаем файл от старых кук
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $file); // куда писать кукисы
curl_setopt($ch, CURLOPT_COOKIEFILE, $file); // откуда считывать кукисы
curl_setopt($ch, CURLOPT_PROXY, $proxy );
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $pass);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_multi_add_handle($multi, $ch);
$channels[$url] = $ch;
}
$active = null;
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi) == -1) {
continue;
}
do {
$mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
foreach ($channels as $k=>$channel) {
$html = curl_multi_getcontent($channel);
if($html=='') $this->step2($url); //Нужен еще один курл
$info = curl_getinfo($channel);
$jsonInfo = json_encode($info);
curl_multi_remove_handle($multi, $channel);
}
curl_multi_close($multi);
}
public function step2($url) {
$proxyName = $this->getProxyAssocUrl($url); //Получаем название прокси, с которым связана ссылка
$file = dirname(__FILE__)."/cookies/".$proxyName.".txt"; //Определяем файл куки, который уже используется для текущего прокси
$chImg = curl_init();
curl_setopt($chImg, CURLOPT_TIMEOUT, 10);
curl_setopt($chImg, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($chImg, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chImg, CURLOPT_COOKIEJAR, $file); // куда писать кукисы
curl_setopt($chImg, CURLOPT_COOKIEFILE, $file); // откуда считывать кукисы
curl_setopt($chImg, CURLOPT_PROXY, $proxyName );
curl_setopt($chImg, CURLOPT_PROXYUSERPWD, $proxyPass);
curl_setopt($chImg, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($chImg, CURLOPT_URL, $imgUrl);
//curl_setopt($chImg, CURLOPT_HEADER, 1);
$img = curl_exec($chImg);
curl_close($chImg);
}
Суть проблемы такая: после отработки $this->step2($url); результат возвращается без учета текущей сессии, как будто в методе step2() не отправляются куки, либо куки-файл перезаписывается заново.