Problème d'execution d'un long script sous SSH

Bhen
Invité n'ayant pas de compte PHPfrance

11 mai 2012, 00:21

Bonjour,

J'ai réalisé un script qui a pour but de récupérer un grand nombre d'images sur un autre site (une image par page).
Le script est structuré comme ceci :
$pages = array(); //$pages[0] = 'http://xxx.com/lala.html', $pages[1] = 'http://xxx.com/coucou.html', etc... jusqu'à ~2000 adresses structurées de la même façon
$nbpages = sizeof($pages); //Nombres de pages indexées dans le tableau

for ($i = 0; $i <= $nbpages; $i++) { //Pour chaque page indexée,

$url = $pages[$i]; 
$codeSource = curl($url); //On va récupérer le code source de la page à l'aide de CURL
$lienImage = "http://njnk.com/B6RFB/lala.jpg" //A l'aide de strpos(), on "filtre" le code source afin de récupérer l'adresse de l'image
uploadThisImageToMyServer($lienImage); //Je copie l'image sur mon propre serveur

}
Ce script dure trèèès longtemps, je le démarre donc via un simple "php fichier.php" en SSH.

Le problème : Le script fonctionne très bien jusqu'à un certain moment (10-15 minutes après le début) où ça m'affiche le warning "Offset not contained in string" qui signifie que strpos() ne peux donner la position de la chaine que je recherche car l'offset n'est pas bon. Ça m'a fait ça pendant 10 minutes, où aucune image n'a donc été uploadée, puis le script a continué à fonctionner normalement...

J'ai fait des tests individuels sur les urls concernées, aucun problème !

D'où cela peut-il bien venir ?
Merci :)

ViPHP
xTG
ViPHP | 7331 Messages

11 mai 2012, 07:06

Faudrait peut être nous montrer le code concerné, car aucun strpos là dedans. ;)

Bhen
Invité n'ayant pas de compte PHPfrance

11 mai 2012, 08:09

J'ai fait des tests individuels sur les urls concernées, aucun problème !
Le problème ne vient pas du code mais du serveur qui doit saturer au bout d'un moment je pense...
Je vais essayer de tester quelque chose dans ce genre là et je vous tient au courant :
$pagesEchec = array();
for ($i = 0; $i <= $nbpages; $i++) {
     $urlimage = strpos("blablabla");

     if ($urlimage === false) {
          $pages[$i] = $pagesEchec[$i]; //On copie l'url de la page dont le traitement a échoué dans un tableau pagesEchec
     }
}
Si une erreur intervient lors du strpos, on laisse en quelque sorte cette page de côté pour la fin...

ViPHP
ViPHP | 2577 Messages

11 mai 2012, 10:41

Il est possible que le serveur constate trop de requetes de ta part et te blacklist provisoirement pour éviter une surcharge.

Dans un premier temps tu pourrais vérifier les erreurs rencontrées par curl (curl_error et curl_errno)
Dans un second, tu pourrais ajouter une temporisation entre 2 accès.

Bhen
Invité n'ayant pas de compte PHPfrance

11 mai 2012, 11:49

Aucune erreur CuRL détectée !
Et en rajoutant 2 à 3 sleep(1); par-ci par-là, ça fonctionne depuis maintenant une demi-heure !

Merci à tous :)

Bhen
Invité n'ayant pas de compte PHPfrance

11 mai 2012, 11:59

J'ai parlé trop vite :(

Après 33 minutes sans aucune erreur, je n'ai que des :
Erreur CuRL : connect() timed out !

... des idées ?

ViPHP
ViPHP | 2577 Messages

11 mai 2012, 13:35

Peut être qu'en faisant une boucle :
<?PHP
$compteur = 1;
$codeSource = curl($url); 
while (curl_errno() != 0)
{
    echo curl_error(),'/ essai ',$compteur,"\n";
    if ($compteur++> 10);
    {
       die("trop d'erreurs");
    }
    sleep(2);
    $codeSource = curl($url); 
} 
?>

Bhen
Invité n'ayant pas de compte PHPfrance

11 mai 2012, 14:13

Pensez-vous qu'il est possible de se faire bannir son adresse ip au bout d'un moment ?
Car sans avoir rien touché au code, j'ai maintenant des erreur du type : couldn't resolve host

ViPHP
ViPHP | 2577 Messages

11 mai 2012, 14:36

A priori, c'est un problème de serveur de noms, les serveurs de noms dépendent de ton hébergement, pas du site que tu visites.
Il est possible de tombé sur un moment ou le serveur est surchargé ou alors un problème réseau passager.

Vu les problèmes que tu rencontres, tu devais stocker les noms de fichiers dans une table et les supprimer 1 par un après traitement. Comme ca tu pourrais en venir à bout après quelques lancements sans reprendre du début à chaque fois. Tu pourrais même prévoir d'en traiter un certain nombre et de stopper.

Pour info, j'ai fais un script qui chargeait des pages d'un site, ca n'a jamais marché du boulot, ca a marché presque du premier coup de chez moi. Problèmes de proxy et de réseau au boulot.