2009-02-25 4 views
3

Je cours PHP 5.2 sur Fedora, et je continue à recevoir cet avertissement après environ 1000 itérations de ma boucle, ce qui signifie que le programme a cessé de fonctionner et doit être redémarré. Je pourrais régler cela pour sortir après 1000 itérations et redémarrer par l'intermédiaire d'un cron peu de temps après, mais cela ressemble à l'issue lâche. La boucle suit; Je devrais ajouter que get_load() préforme un appel file_get_contents().PHP Attention: Trop de fichiers ouverts - des idées?

while ($row = select_row($sql)) 
{ 
    while (($load = get_load()) > 10) 
    { 
     echo "Going to sleep (load: ".$load.")\n"; 
     sleep(60*3); 
    } 
    $id = $row['id']; 
    foreach ($sizes as $abbr=>$size) 
    { 
     if($row[$size] != "yes") 
     { 
      continue; 
     } 
     $filename = "/images/".$abbr."/".$id.".jpg"; 
     $tmp_file = "/tmp/".$id.".jpg"; 
     if ($size == "large") 
     { 
      //We want to progressively interlace our large bookcovers because it saves on filesave above 10K. 
      $cmd = "convert -strip -interlace Plane ".$filename." ".$tmp_file; 
     } 
     else 
     { 
      $cmd = "convert -strip ".$filename." ".$tmp_file; 
     } 
     $convert = popen($cmd." 2>&1", "r"); 
     if (is_resource($convert)) 
     { 
      echo fgets($convert); 
      if(pclose($convert) == 0) 
      { 
       //Upload converted file to remote server 
      } 
      unlink($tmp_file); 
     } 
    } 

Edit: Après avoir lu les deux premières réponses, je me suis rendu qu'en prenant le code de téléchargement de fichier qui n'a pas été utile à mon problème, je pris ma déclaration pclose(). Mettez dans le pclose() tel qu'il apparaît dans mon code.

plus modifier: Posté get_load() comme l'a demandé

function get_load() 
{ 
    $load = explode(" ", file_get_contents("/proc/loadavg")); 
    return $load[0]; 
} 
+0

PHP 5 a déjà une fonction 'sys_getloadavg': http://docs.php.net/sys_getloadavg – Gumbo

+0

Je n » Je sais que - merci! –

+0

En outre: je doute que vos appels 'convert' fonctionnent. Ou sont $ filename et $ tmp_file des chemins de système de fichiers vraiment absolus? – Gumbo

Répondre

2

Essayez de fermer le processus à chaque fois après que vous écrivez avec pclose().

4

Vous devez fermer le pointeur après l'avoir utilisé avec pclose.

0

popen ne peut renvoyer que deux choses, soit une ressource, soit FALSE. Peut-être devriez-vous tester FALSE au lieu de is_resource? Vous fuyez les handles de fichiers, donc la chose évidente à vérifier est de s'assurer que vous fermez toujours un fichier une fois que vous l'ouvrez, et l'endroit où vous ouvrez les handles de fichiers est l'appel popen. Tracez votre logique et assurez-vous que vous n'êtes pas en train d'ignorer la fermeture de ces tuyaux, soit par une erreur de logique ou une exception.

+0

Comment fermez-vous quelque chose qui n'est pas une ressource? Dans les versions précédentes de ce script, PHP lançait un avertissement pour essayer de fermer quelque chose qui n'était pas une ressource. –

+0

Comment l'ouvrez-vous? –

+0

J'ai essayé de placer un pclose dans un autre pour la vérification is_resource, et après le démarrage des avertissements, il a également commencé à donner des erreurs lorsque j'ai essayé de fermer les pointeurs non-ressources. –

0

Je sais que vous avez dit get_load() utilise file_get_contents(), mais pour s'assurer ... ferme-t-il correctement tous les fichiers qu'il ouvre? Pourriez-vous poster le code de cette fonction?

Éditer: Même si c'est une fonction intégrée, essayez d'utiliser autre chose que file_get_contents() pour lire le fichier et voir ce qui se passe.

+0

'file_get_contents' est une fonction PHP intégrée. Il serait imprudent de ne pas fermer le fichier après avoir lu son contenu. – Gumbo

Questions connexes