Domanda

Sono stato bisogno di un modo per generare le miniature (usando PHP5) per uno script di gestione delle immagini e avuto un problema in cui il mio ospite ha più versioni di PHP installata (4 e 5), con set PHP4 come default. Questo significava che le chiamate a PHP dalla CLI correrebbe PHP4. Mi è venuta in mente quanto segue come quello che spero di essere una soluzione cross platform. Sto postando qui soprattutto come ho avuto un sacco di problemi a trovare alcun aiuto l'utilizzo di Google, quindi questo potrebbe aiutare qualcuno in futuro, ho anche le seguenti domande.

  1. Non si vede nulla, ovviamente, che non va?
  2. Ci sono altri percorsi del binario PHP5 che si sa o sa di un modo migliore per avere l'array per l'ottimizzazione?
  3. Se un host ha exec o shell_exec disabilitato, sarà lo script EGalleryProcessQueue.php essere in grado di essere eseguito come un processo di cron standalone? Non ho accesso a cron per essere in grado di testare questo ancora. Io non sono troppo preoccupato per questa domanda, come vado a prendere in giro per il test che alla fine comunque.
  4. Qualcuno ha qualche suggerimento come a un modo in cui posso ottenere un feedback fino a che punto attraverso le immagini il trattamento è? Vedere la sezione TODO di EGalleryProcessQueue.php mi piacerebbe visualizzare una barra di avanzamento quando è nella sezione di amministrazione.

script principale

/**
 * Writes the array to a text file in /path/to/gallery/needsThumbs.txt for batch processing.
 * Runs the thumbnail generator script in the background.
 *
 * @param array $_needsThumbs the array of images needing thumbnails
 */
private function generateThumbnails($_needsThumbs)
{
    file_put_contents($this->_realpath.DIRECTORY_SEPARATOR.'needsThumbs.txt',serialize($_needsThumbs));

    $Command = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryProcessQueue.php '.$this->_realpath.' '.$this->thumbnailWidth.' '.$this->thumbnailHeight;

    if(PHP_SHLIB_SUFFIX == 'so')// *nix (aka NOT windows)
    {
        /*
         * We need to make sure we are using the right PHP version
         * (problems with shared hosts that have PHP4 and PHP5 installed,
         * but PHP4 set as default).
         */
        $phpPaths = array('php', '/usr/local/bin/php', '/usr/local/php5/bin/php', '/usr/bin/php', '/usr/bin/php5');
        foreach($phpPaths as $path)
        {
            exec("echo '<?php echo version_compare(PHP_VERSION, \"5.0.0\", \">=\"); ?>' | $path", $result);
            if($result)
            {
                shell_exec("nohup $path $Command 2> /dev/null > /dev/null &");
                break;
            }
        }
    }
    else // Windows
    {
        $WshShell = new COM("WScript.Shell");
        $WshShell->Run("php.exe $Command", 0, false);
    }
}

EGalleryProcessQueue.php

#!/usr/bin/php
<?php

if ($argc === 4 && strstr($argv[0], basename(__FILE__))) {
    // File is being called by the CLI and has not been included by another script

    if(!file_exists($argv[1].DIRECTORY_SEPARATOR.'needsThumbs.txt'))
    {
        // Either no thumbnails need to be created or a wrong directory has been supplied
        exit;
    }

    include(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryThumbGenerator.php');

    $generator = new EGalleryThumbGenerator;
    $generator->directory = $argv[1];
    $generator->thumbnailWidth = is_int($argv[2]) ? $argv[2] : 128;
    $generator->thumbnailHeight = is_int($argv[3]) ? $argv[3] : 128;

    // $generator->processImages() returns the number of images left to process (it does them in blocks of 10)
    while (($i = $generator->processImages()) > 0)
    {
        /*
         * TODO Can we get some sort of feedback to the user here?
         * Possibly so that we can display a progress bar in the management section.
         * Probably have to write $i to a file to be read by the main script.
         */
    }

    exit;
}
?>
È stato utile?

Soluzione

  

Non si vede nulla, ovviamente, che non va?

No, il codice sembra buono.

  

Ci sono altri percorsi del binario PHP5 che si sa o sa di un modo migliore per avere l'array per l'ottimizzazione?

Questa è una domanda difficile a cui rispondere, come PHP può essere installato ovunque su un server. I percorsi si devono sembrano essere molto logico per me, ma ci potrebbe essere un qualsiasi numero di altri posti che potrebbe essere installato.

Piuttosto che fornire una serie di directory in cui potrebbe essere installato PHP5, quello di avere un parametro l'utente deve impostare per fornire il percorso del file eseguibile PHP5 se non è nella loro $ PATH?

  

Se un host ha exec o shell_exec disabilitato, sarà lo script EGalleryProcessQueue.php essere in grado di essere eseguito tramite un processo di cron?

Non ho ancora testato, ma presumo che impedirebbe l'esecuzione dello script.

  

Qualcuno ha qualche suggerimento come a un modo in cui posso ottenere un feedback fino a che punto attraverso le immagini il trattamento è? Vedere la sezione TODO di EGalleryProcessQueue.php mi piacerebbe visualizzare una barra di avanzamento quando è nella sezione di amministrazione.

Memorizzare il numero di immagini completate da qualche parte (File, db, forse anche la sessione var) e hanno un fuoco chiamata AJAX ogni secondo o giù di lì a una funzione che fornisce fatto vs totale. Quindi utilizzare qualcosa come http://docs.jquery.com/UI/Progressbar

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top