2010-08-30 6 views
1

je veux obtenir plusieurs pages par curl_exec, la première page est venu normalement, mais tous les autres - 302 header, quelle raison?php problème curl multiple

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, ROOT_URL); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$content = curl_exec($curl); // here good content 
curl_close($curl); 

preg_match_all('/href="(\/users\/[^"]+)"[^>]+>\s*/i', $content, $p); 

for ($j=0; $j<count($p[1]); $j++){ 
    $new_curl = curl_init(); 
    curl_setopt($new_curl, CURLOPT_URL, NEW_URL.$p[1][$j]); 
    curl_setopt($new_curl, CURLOPT_RETURNTRANSFER, 0); 
    $content = curl_exec($new_curl); // here 302  
    curl_close($new_curl); 

preg_match('/[^@][email protected][^"]+/i', $content, $p2); 

}

smth comme celui-ci

+2

du code, nous aider à –

+0

Qu'advient-il si vous frappez manuellement les urls vous générez de vos données preg_match_all dans un navigateur? Est-ce que ces tentatives sont également redirigées? Avez-vous vérifié que les URL que vous construisez sont valides? –

Répondre

1

Vous voulez sans doute de fournir un échantillon de votre code afin que nous puissions voir si vous omettre quelque chose. Le code de réponse 302 indique généralement que le serveur vous redirige vers un emplacement différent (trouvé dans l'en-tête de réponse Location). En fonction des indicateurs que vous utilisez, CURL peut les récupérer automatiquement ou vous pouvez regarder la réponse 302 et la récupérer vous-même.

Voici comment vous obtiendriez CURL à suivre les redirections (où $ ch est la poignée à votre connexion boucle):

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);// allow redirects 
+0

CURLOPT_MAXREDIRS et CURLOPT_AUTOREFERER – VolkerK

+0

Je peux obtenir le contenu de la page (sans redirections) si je vais faire un appel curl_exec dans mon script, donc pas de problème de redirection. Peut-être que c'est le site (dont je voudrais analyser) la restriction ... – hippout

+0

@hippout: "donc pas de problème de redirection" - 302/303 est tout à fait clair. Oui, c'est peut-être une restriction du site distant. Peut-être que vous n'êtes pas autorisé à aller chercher plus d'un document à la fois. Laissez simplement curl suivre la redirection et voir le document _this_ contient alors un message d'erreur. – VolkerK

-1

Vous pouvez utiliser plusieurs boucles qui est plus rapide et peut obtenir des données de tous les url est en parallèle. Vous pouvez l'utiliser comme ceci

//Initialize 
$curlOptions = array(CURLOPT_RETURNTRANSFER => 1);//Add whatever u additionally want. 
$curlHandl1 = curl_init($url1); 
curl_setopt_array($curlHandl1, $curlOptions); 

$curlHandl2 = curl_init($url2); 
curl_setopt_array($curlHandl2, $curlOptions); 

$multi = curl_multi_init(); 
curl_multi_add_handle($multi, $curlHandle1); 
curl_multi_add_handle($multi, $curlHandle2); 

//Run Handles 
$running = null; 
do { 
    $status = curl_multi_exec($mh, $running); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($running && $status == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
    do { 
     $status = curl_multi_exec($mh, $running); 
    } while ($status == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

//Retrieve Results 
$response1 = curl_multi_getcontent($curlHandle1); 
$status1 = curl_getinfo($curlHandle1); 

$response1 = curl_multi_getcontent($curlHandle1); 
$status1 = curl_getinfo($curlHandle1); 

Vous pouvez trouver plus d'informations ici http://www.php.net/manual/en/function.curl-multi-exec.php Commander le Example1