2013-03-22 31 views
0

我是一個PHP新手,因此尋找一些關於PHP函數的建議,我已經創建在Wordpress安裝中使用。提高我的解壓和移動功能 - PHP

正如您從下面的代碼可以看到的,當管理員在待處理的帖子上按下「發佈」時,它會運行。

它需要用戶通過Gravity Forms上傳的Zip文件,然後解壓縮.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 2013-03-22 11:17:34

+0

甚至不知道存在...謝謝,我會檢查出來 – 2013-03-22 13:59:38

回答

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