البرنامج النصي للخلفية على مضيف مشترك مع تثبيت إصدارات PHP متعددة

StackOverflow https://stackoverflow.com/questions/1985354

سؤال

كنت بحاجة إلى طريقة لإنشاء الصور المصغرة (باستخدام PHP5) لبرنامج نصي لإدارة الصور وكان لدي مشكلة حيث يكون مضيفتي لديه إصدارات متعددة من PHP مثبتة (4 و 5) ، مع تعيين PHP4 كإعداد افتراضي. هذا يعني أن أي مكالمات إلى PHP من CLI ستدير PHP4. لقد توصلت إلى ما يلي كما أتمنى أن أكون حلًا عبر النظام الأساسي. أنا أنشرها هنا في المقام الأول حيث واجهت مشكلة كبيرة في العثور على أي مساعدة باستخدام Google ، لذلك قد يساعد هذا شخص ما في المستقبل ، كما أن لدي الأسئلة التالية.

  1. هل ترى أي شيء خاطئ بوضوح؟
  2. هل هناك أي مسارات أخرى إلى ثنائي PHP5 تعرفه أو تعرفه عن أمر أفضل للحصول على الصفيف للتحسين؟
  3. إذا كان المضيف قد تم تعطيل exec أو shell_exec ، فهل يمكن تشغيل البرنامج النصي egalleryprocessqueue.php كوظيفة cron مستقلة؟ ليس لدي إمكانية الوصول إلى كرون لأتمكن من اختبار هذا بعد. أنا لست قلقًا جدًا بشأن هذا السؤال ، حيث سأتجول في اختباره في النهاية على أي حال.
  4. هل لدى أي شخص أي اقتراحات بشأن طريقة يمكنني من خلالها الحصول على بعض الملاحظات حول المدى الذي تمر به المعالجة؟ راجع قسم TODO في egalleryprocessqueue.php أود عرض شريط التقدم عندما يكون في قسم المشرف.

السيناريو الرئيسي

/**
 * 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;
}
?>
هل كانت مفيدة؟

المحلول

هل ترى أي شيء خاطئ بوضوح؟

كلا ، الرمز يبدو جيدا.

هل هناك أي مسارات أخرى إلى ثنائي PHP5 تعرفه أو تعرفه عن أمر أفضل للحصول على الصفيف للتحسين؟

هذا سؤال صعب للإجابة عليه ، حيث يمكن تثبيت PHP في أي مكان على الخادم. يبدو أن المسارات التي لديك منطقية للغاية بالنسبة لي ، ولكن يمكن أن يكون هناك أي عدد من الأماكن الأخرى يمكن تثبيتها.

بدلاً من توفير مجموعة من الدلائل التي قد يتم فيها تثبيت PHP5 ، ماذا عن وجود معلمة يجب على المستخدم تعيينها لتوفير المسار إلى PHP5 القابل للتنفيذ إذا لم يكن في مسار $؟

إذا كان المضيف قد تم تعطيل exec أو shell_exec ، فهل يمكن تشغيل البرنامج النصي egalleryprocessqueue.php عبر وظيفة cron؟

لم أختبرها ، لكنني أفترض أن هذا من شأنه أن يمنع البرنامج النصي من الجري.

هل لدى أي شخص أي اقتراحات بشأن طريقة يمكنني من خلالها الحصول على بعض الملاحظات حول المدى الذي تمر به المعالجة؟ راجع قسم TODO في egalleryprocessqueue.php أود عرض شريط التقدم عندما يكون في قسم المشرف.

قم بتخزين عدد الصور المكتملة في مكان ما (ملف ، DB ، وربما حتى الجلسة VAR) ولديها مكالمة AJAX FIRE كل ثانية أو نحو ذلك إلى وظيفة توفرها مقابل المجموع. ثم استخدم شيئًا مثل http://docs.jquery.com/ui/ProgressBar

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top