2013-03-22 2 views
0

Я начинаю PHP и поэтому ищу некоторые советы по функции PHP, которую я создал для использования в рамках установки Wordpress.Улучшите мою функцию Unzip & Move - PHP

Как вы можете видеть из приведенного ниже кода, он запускается, когда один из администраторов нажимает «Опубликовать» на ожидающем сообщении.

Он принимает файл Zip, который был загружен пользователем через Gravity Forms, а затем распаковывает только расширения .mp3. Обновляет и перемещает все файлы в новую папку в нашем каталоге Amazon S3.

Код собран из моих ограниченных знаний и некоторой помощи по пути с вопросами здесь.

Итак, вот что я закончил с:

add_action('pending_to_publish', 'unzip_to_s3'); 
    function unzip_to_s3() { 
    global $post; 
    global $wpdb; 

    // Only run function if post is portfolio post type 
    if ('portfolio' == $post->post_type) { 

    // Set temp path 
    $temp_path = '../wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/tmp/'; 

    // Get filename from Zip file 
    $file = get_post_meta($post->ID, 'file_url', true); 
    $zip_file = basename($file); 

    // Create full Zip file path 
    $zip_file_path = $temp_path.$zip_file; 

    // Generate unique name for temp sub_folder for unzipped files 
    $temp_unzip_folder = uniqid('temp_TMS_', true); 

    // Create full temp sub_folder path 
    $temp_unzip_path = $temp_path.$temp_unzip_folder; 

    // Make the new temp sub_folder for unzipped files 
    if (!mkdir($temp_unzip_path, 0755, true)) { 
    die('Error: Could not create path: '.$temp_unzip_path); 
    } 

    // Unzip files to temp unzip folder, ignoring anything that is not a .mp3 extension 
    $zip = new ZipArchive(); 
    $filename = $zip_file_path; 

    if ($zip->open($filename)!==TRUE) { 
     exit("cannot open <$filename>\n"); 
    } 

    for ($i=0; $i<$zip->numFiles;$i++) { 
     $info = $zip->statIndex($i); 
     $file = pathinfo($info['name']); 
     if(strtolower($file['extension']) == "mp3") { 
      file_put_contents($temp_unzip_path.'/'.basename($info['name']), $zip->getFromIndex($i)); 
     } else { 
     $zip->deleteIndex($i); 
     } 
    } 
    $zip->close(); 

    // Re-zip the unzipped mp3's and store new zip file in temp folder created earlier 
    $temp_unzip_path = $temp_unzip_path.'/'; 
    $zip = new ZipArchive(); 
    $dirArray = array(); 
    $new_zip_file = $temp_unzip_path.$zip_file; 

    $new = $zip->open($new_zip_file, ZIPARCHIVE::CREATE); 
    if ($new === true) { 
     $handle = opendir($temp_unzip_path); 
     while (false !== ($entry = readdir($handle))) { 
      if(!in_array($entry,array('.','..'))) 
      { 
       $dirArray[] = $entry; 
       $zip->addFile($temp_unzip_path.$entry,$entry); 
      } 
     } 
     closedir($handle); 
    } else { 
     echo 'Failed to create Zip'; 
    } 

    $zip->close(); 

    // Set Media bucket dir 
    $bucket_path = '../wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/mixtape2/'; 

    // Generate unique name for sub_bucket 
    $sub_bucket = uniqid('TMS_', true); 

    // Create full sub_bucket path 
    $sub_bucket_path = $bucket_path.$sub_bucket; 

    // Make the new sub_bucket 
    if (!mkdir($sub_bucket_path, 0755, true)) { 
    die('Error: Could not create path: '.$sub_bucket_path); 
    } 

    // Move mp3's to new sub_bucket 
    // Get array of all source files 
    $files = scandir($temp_unzip_path); 
    // Identify directories 
    $source = $temp_unzip_path; 
    $destination = $sub_bucket_path.'/'; 
    // Cycle through all source files 
    foreach ($files as $file) { 
    if (in_array($file, array(".",".."))) continue; 
     // if move files is successful delete the original temp folder 
     if (rename($source.$file, $destination.$file)) { 
      rmdir($temp_unzip_path); 
     } 
    } 

    // Delete original Zip file 
    unlink($temp_path.$zip_file); 

    // Update Custom field for new Zip file location 
    update_post_meta($post->ID, 'file_url', 'http://themixtapesite.com/wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/mixtape2/'.$sub_bucket.'/'.$zip_file); 

    } 
    } 

Хотя эта функция делает работу, мы имеем дело с большими файлами и поэтому он займет некоторое время, чтобы обработать ... Происходящее когда администратор нажимает на публикацию, он запускает эту функцию, но страница просто сидит там, пока она не закончит эту функцию, а затем продолжит. Эта функция может занять около 5 минут.

Я ищу для оптимизации этой функции (с точки зрения кода), но также вижу, есть ли способ, которым я могу запустить это в фоновом режиме, чтобы администратор мог продолжать с другими вещами и не должен сидеть там, ожидая ,

Любая помощь приветствуется.

+0

Звуки больше как кандидата на http://codereview.stackexchange.com. – deceze

+0

даже не знал, что существует ... спасибо, я проверю это –

ответ

0

Возможно, вы захотите попробовать WP cron и запланировать задачу в этот момент, чтобы она работала в фоновом режиме. Вот некоторые ресурсы для этого. базовая концепция будет идти примерно так.

if (! wp_next_scheduled('pending_to_publish')) { 
    wp_schedule_single_event($timestamp,'pending_to_publish'); 
} 

add_action('pending_to_publish', 'unzip_to_s3'); 

http://wpengineer.com/1908/use-wordpress-cron/

http://codex.wordpress.org/Category%3aWP-Cron_Functions

https://wordpress.stackexchange.com/questions/42694/run-a-cron-job-or-similar-in-the-background-of-wp-after-post-update-create

Смежные вопросы