Page 1 sur 1

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

Posté : 11 mai 2012, 00:21
par Bhen
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 :)

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

Posté : 11 mai 2012, 07:06
par xTG
Faudrait peut être nous montrer le code concerné, car aucun strpos là dedans. ;)

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

Posté : 11 mai 2012, 08:09
par Bhen
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...

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

Posté : 11 mai 2012, 10:41
par Mazarini
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.

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

Posté : 11 mai 2012, 11:49
par Bhen
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 :)

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

Posté : 11 mai 2012, 11:59
par Bhen
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 ?

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

Posté : 11 mai 2012, 13:35
par Mazarini
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); 
} 
?>

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

Posté : 11 mai 2012, 14:13
par Bhen
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

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

Posté : 11 mai 2012, 14:36
par Mazarini
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.