Pergunta

Eu estava precisando de uma maneira de gerar miniaturas (usando o PHP5) para um script de gerenciamento de imagens e tinha um problema em que meu host tem várias versões de PHP instalado (4 e 5), com o Php4 definido como padrão. Isso significava que quaisquer chamadas para PHP da CLI executariam o PHP4. Eu criei o seguinte como o que espero ser uma solução de plataforma cruzada. Estou publicando aqui principalmente, pois tive muitos problemas para encontrar qualquer ajuda usando o Google; portanto, isso pode ajudar alguém no futuro, também tenho as seguintes perguntas.

  1. Você vê algo obviamente errado com isso?
  2. Existem outros caminhos para o binário Php5 que você conhece ou conhece uma ordem melhor para ter a matriz para otimização?
  3. Se um host tiver executado ou shell_exec desativado, o script EgalleryProcessQueue.php poderá ser executado como um trabalho de cron independente? Não tenho acesso a Cron para poder testar isso ainda. Não estou muito preocupado com essa pergunta, pois vou testá -la eventualmente de qualquer maneira.
  4. Alguém tem alguma sugestão sobre uma maneira pela qual posso obter algum feedback sobre a que distância as imagens estão o processamento? Consulte a seção TODO do EgalleryProcessQueue.php Eu gostaria de exibir uma barra de progresso quando estiver na seção de administrador.

Script principal

/**
 * 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;
}
?>
Foi útil?

Solução

Você vê algo obviamente errado com isso?

Não, o código parece bom.

Existem outros caminhos para o binário Php5 que você conhece ou conhece uma ordem melhor para ter a matriz para otimização?

Essa é uma pergunta difícil de responder, pois o PHP pode ser instalado em qualquer lugar de um servidor. Os caminhos que você parecem muito lógicos para mim, mas pode haver qualquer número de outros lugares em que possa ser instalado.

Em vez de fornecer um monte de diretórios onde o PHP5 pode ser instalado, que tal ter um parâmetro que o usuário deve definir para fornecer o caminho para o executável do PHP5 se não estiver no caminho $?

Se um host tiver executado ou shell_exec desativado, o script EgalleryProcessQueue.php poderá ser executado por meio de um trabalho de cron?

Eu não testei, mas presumo que isso impediria que o script fosse executado.

Alguém tem alguma sugestão sobre uma maneira pela qual posso obter algum feedback sobre a que distância as imagens estão o processamento? Consulte a seção TODO do EgalleryProcessQueue.php Eu gostaria de exibir uma barra de progresso quando estiver na seção de administrador.

Armazene o número de imagens concluídas em algum lugar (arquivo, db, talvez até sessão var) e tenha um incêndio em chamadas AJAX a cada segundo ou mais para uma função que forneça um total realizado. Em seguida, use algo como http://docs.jquery.com/ui/progressbar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top