Ejecutar un extenso script PHP - escribe XML

Tengo un script PHP bastante extenso que debo ejecutar en mi base de datos, así como recopilar tamaños de imagen de la estructura del archivo y escribir esa información en un archivo XML. Intenté ejecutarlo directamente desde el navegador web con un éxito mínimo ya que el Gateway se agotó después de unos 3 minutos. También he intentado ejecutar desde un shell ssh sin éxito. aquí está la mayor parte del guión

    //Get all galleries from client
            $query = mysql_query("SELECT *
                                    FROM gallery
                                    WHERE clientRef BETWEEN 420
                                    AND 430
                                    ORDER BY clientRef
                                ");

            while ($row = mysql_fetch_array($query)) {

            //set gallery id

            $galleryID =  $row['id'];
            $clientRef = $row['clientRef'];
        //Check image sizes and set horizontal vs vertical
            $fImageSizeName = mysql_fetch_array($qAlbumImages);
            $imageSizeName = $fImageSizeName['OrgImageName'];

            $galleryPath = $_SERVER['DOCUMENT_ROOT'] . "/data/gallery/" . $galleryID . "/images/"; 

            if(is_dir($galleryPath)) {
                list($width, $height) = getimagesize($_SERVER['DOCUMENT_ROOT'] . "/data/gallery/" . $galleryID . "/images/album/" . $imageSizeName);

    header("Content-Type: text/plain");


        //Create the xml document
        $xmlDoc = new DOMDocument();

        //Create the root Element
        $root = $xmlDoc->appendChild(
                $xmlDoc->createElement("PageflipDataSet"));
        //Create settings element
        $settings = $root->appendChild(
                    $xmlDoc->createElement("Settings"));
    //Create PageOrder Node
        $PageOrder = $root->appendChild(
                    $xmlDoc->createElement("PageOrder"));

        $qAlbumImages = mysql_query("   SELECT *
                                        FROM galleryimage 
                                        WHERE galleryId='{$galleryID}' 
                                        AND clientRef= '{$clientRef}' 
                                        ORDER BY sort
                                    ");

        while ($fAlbumImages = mysql_fetch_array($qAlbumImages)) {
            $path  = "../../../../data/gallery/" . $galleryID . "/images/album/" . $fAlbumImages['OrgImageName'];
            //Create the PageData Node
            $PageData = $PageOrder->appendChild(
                        $xmlDoc->createElement("PageData"));
                //PageFile attribute
                $PageData->appendChild(
                        $xmlDoc->createAttribute("PageFile"))->appendChild(
                        $xmlDoc->createTextNode($path));
        }//close while

//Format output so it looks pretty
    $xmlDoc->formatOutput = true;
    //Save and create path to gallery ID

    $galleryPath = $_SERVER['DOCUMENT_ROOT'] . "/data/gallery/" . $galleryID;

    //Set path
    if(is_dir($galleryPath)) {
        $xmlPath = $_SERVER['DOCUMENT_ROOT'] . '/data/gallery/' . $galleryID . '/xml/pageflipdata.xml';
        $xmlDoc->save($xmlPath);
    }
}//close while

Cualquier sugerencia sobre cómo debería hacer esto. Hay alrededor de 2000 clientRef y cada uno de los clientRef tiene de 5 a 10 álbumes que pueden contener de 15 a 30 imágenes.

preguntado el 04 de julio de 12 a las 09:07

1 Respuestas

Si el problema principal es el tiempo de espera, puede hacerlo en partes más pequeñas y combinar el xml más tarde de forma manual.

Si esto necesita ejecutarse regularmente, puede usar un proceso similar pero ejecutar cada 'fragmento más pequeño' en una solicitud diferente usando ajax o algo así para esperar la confirmación de todos los scripts de fragmentos pequeños para ejecutar un script de combinación xml.

Por supuesto, simplemente aumentar el max_execution_time de PHP sería más fácil. Si no tiene acceso a esto, es posible que pueda ajustar algo para que funcione monitoreando el tiempo de ejecución y luego llamando límite de tiempo establecido para restablecer el temporizador de nuevo. Sin embargo, nunca he probado esto, así que solo es una idea.

Respondido 04 Jul 12, 10:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.