2008-10-17 8 views
2

Je n'ai aucune idée. Cela provoque des délais d'attente apparemment aléatoires. Ceux-ci à son tour briser le flash que je le charge. Est-ce que quelqu'un a déjà vu quelque chose comme ça?PHP générant XML, time-out au hasard

<?php 
require_once("../includes/class.database.php"); 
require_once("../includes/dbConnectInfo.inc"); 
require_once("../includes/functions.php"); 

include("../includes/conn.php"); 

$cat = $_GET['category']; 
$result = mysql_query("SELECT * FROM media WHERE related_page_id=4 && type='copy' ORDER BY id ASC LIMIT 6"); 

$media = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n"; 
$media .= "<content>\n"; 
while($row = mysql_fetch_array($result)) { 
    $media .="<member>\n"; 
    $body = $row[copy]; 

    if($row[title] == "") { 
     $media .= "<title><![CDATA["; 
     $media .= "Team"; 
     $media .="]]></title>\n"; 
    } elseif ($row['path']=="") { 
     $name = explode("/",$row[title],2); 

     $media .= "<name><![CDATA["; 
     $media .= $name[0]; 
     $media .="]]></name>\n"; 

     $media .= "<job><![CDATA["; 
     $media .= $name[1]; 
     $media .="]]></job>\n"; 
    } 

    if($body !="") { 
     $media .="<bio><![CDATA["; 
     $media .= $body; 
     $media .= "]]></bio>\n"; 
    } 

    $something = $row['id']; 
    $result1 = mysql_query("SELECT * FROM media WHERE assets='$something'"); 
    $media .= "<images>"; 
    while($row1 = mysql_fetch_array($result1)) { 
     $img = explode("/",$row1[path],2); 
     $media .= "<image url='$img[1]' />"; 
    } 
    $media .= "</images>\n"; 
    $media .="</member>\n"; 
} 
$media .= "</content>"; 
echo $media; 
?> 
+0

Ne serait-il pas être plus rapide de combiner les deux requêtes en un seul avec une jointure, plutôt que de faire une requête supplémentaire pour chaque ligne renvoyée par le premier? –

Répondre

3

Que se passe-t-il si vous ajoutez set_time_limit(0); au code? J'ajoute habituellement cette ligne au code d'exécution longue sous les instructions include.

Depuis cela fonctionne, laissez-moi élaborer.

Par défaut, les scripts PHP sont mis en place pour exécuter uniquement si longtemps. Je crois que la limite est de 30 secondes quand PHP est installé, mais cela peut être changé dans le fichier php.ini. Cependant, vous ne voulez peut-être pas autoriser tous les scripts à s'exécuter pendant le même laps de temps. Il se peut que 30 secondes conviennent à la plupart des scripts. La fonction set_time_limit vous permet de définir l'heure d'exécution d'un script. Il prend une valeur entière qui représente le nombre de secondes pour exécuter le script, mais une valeur de 0 signifie que le script s'exécutera pour toujours.

+0

Vive l'homme, fonctionne comme un charme maintenant! –

2

Le délai d'attente par défaut pour PHP est de 30 secondes. Si ce code prend 30 secondes alors je pense que vous avez quelques problèmes! Avez-vous des indices sur la table des médias (un à travers related_page_id + type et un sur assets devrait le faire).

L'augmentation de la limite de temps est plus comme cacher le problème de la fixer, et je voudrais certainement pas utiliser set_time_limit(0);. Vous voulez un maximum raisonnable, que ce soit une minute, une heure, un jour ou autre, selon vos besoins.

+0

Mais il y a du code que vous voulez exécuter jusqu'à la fin. Nous avons une base de données de 30k enregistrements et comptage que nous vérifions tous les mois. Nous ne voulons pas que cela s'arrête pour une raison quelconque, donc une limite de temps infinie est appropriée. –

+0

Voulez-vous vraiment dire ça? Le temps infini signifie plus d'un mois ... l'avez-vous testé avec deux copies (ou plus) du script fonctionnant simultanément? Quel est l'impact sur les performances de l'exécution 24/7? Je pense toujours que vous feriez mieux de prendre le temps maximum pour lequel il fonctionne et en multipliant par exemple 10. – Greg