WordPress.org

Plugin Directory

Changeset 551483


Ignore:
Timestamp:
05/31/12 17:28:25 (23 months ago)
Author:
leogermani
Message:

change the way script generates table, using a temporary file in the disk instead of loading everything in the memory. This avoid memory limit problems when we have lots of users

Location:
wp-users-exporter/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • wp-users-exporter/trunk/A_UserExporter.class.php

    r463878 r551483  
    33    protected $users; 
    44    protected $filename; 
     5    protected $tmpfile; 
    56     
    67    protected $cols = array(); 
     
    1819    protected abstract function printUser($user); 
    1920     
    20     public function __construct(array $users, $filename = ''){ 
     21    public function __construct($filename = ''){ 
    2122        $_cols = array(); 
    2223        $wpue_config = wpue_getConfig(); 
     
    4344                     
    4445        } 
    45              
    46         $this->users = $users; 
     46         
     47        $this->tmpfile = wpue_getUsers_to_tmpfile(); 
     48         
    4749        $this->filename = $filename ? $filename : 'users-'.date('Y-m-d'); 
    4850         
     
    5456    public final function export(){ 
    5557        $this->printHeader(); 
    56         $keys = array_keys($this->users); 
    57           
    58         foreach ($keys as $user_id){ 
    59             $user = $this->users[$user_id]; 
    60             $this->printUser($user); 
    61             unset($this->users[$user_id]); 
     58         
     59        $file_handle = fopen($this->tmpfile, "r"); 
     60         
     61        while (!feof($file_handle)) { 
     62             
     63            $_user = fgets($file_handle); 
     64            $_user = str_replace('||BR||', "\r\n", $_user); 
     65            //if (is_serialized($_user)) { 
     66                $user = unserialize($_user); 
     67                $this->printUser($user); 
     68            //} 
     69             
    6270        } 
     71         
     72        fclose($file_handle); 
     73         
    6374        $this->printFooter(); 
     75         
     76        $this->deleteTempFile(); 
    6477         
    6578        die; 
    6679    } 
    6780     
     81    public function deleteTempFile() { 
     82     
     83        unlink($this->tmpfile); 
     84     
     85    } 
    6886     
    6987    public final static function activate(){ 
  • wp-users-exporter/trunk/wp-users-exporter.php

    r497521 r551483  
    55Description: Users Exporter 
    66Author: hacklab 
    7 Version: 1.1 
     7Version: 1.2 
    88Text Domain: 
    99*/ 
     
    3535            case 'export-users': 
    3636                if(current_user_can('use-wp-users-exporter') && isset($_POST['roles']) && isset($_POST['exporter'])){ 
    37                     $result = wpue_getUsers(); 
     37                     
    3838                    $requested_exporter = $_POST['exporter']; 
    3939                    if (class_exists($requested_exporter) && is_subclass_of($requested_exporter, 'A_UserExporter')) { 
    40                         eval('$exporter = new '.$requested_exporter.'($result);'); 
     40                        eval('$exporter = new '.$requested_exporter.'();'); 
    4141                        $exporter->export(); 
    4242                        die; 
     
    5757                    if ($r['name'] != 'Administrator') { 
    5858                        $role = get_role(strtolower($r['name'])); 
     59                        if (!is_object($role)) 
     60                            continue; 
    5961                        if ($_POST[$r['name']]) { 
    6062                            $role->add_cap('use-wp-users-exporter'); 
     
    229231} 
    230232 
    231  
    232 function wpue_getUsers(){ 
     233/* Get users and save it to a temp file 
     234 * return: string temp file path 
     235 * We use this approach to avoid exceeding the memory limit when we got tens of thousands of users 
     236 */  
     237function wpue_getUsers_to_tmpfile(){ 
    233238    global $wpdb; 
     239     
     240    $tmpfile = tempnam(sys_get_temp_dir(), 'wp-users-exporter'); 
     241     
     242    //To increase speed and avoid memory limit, we do the querys and savings in steps of: 
     243    $step = 1000; 
     244     
    234245    $roles = $_POST['roles']; 
    235246     
     
    306317    } 
    307318     
    308      
     319 
    309320    // seleciona os usuários 
    310     $q = " 
    311         SELECT  
    312             $cols 
     321    $base_q = " 
    313322        FROM  
    314323            $wpdb->users  
     
    324333            $filter 
    325334        ORDER BY $orderby $oby"; 
    326                
    327     $users = $wpdb->get_results($q); 
    328  
    329     $wpue_config = wpue_getConfig(); 
    330     $user_ids = array(); 
    331     // limpa o usuário, removendo as propriedades que não foram selecionadas no formulario 
    332     // de exportação 
    333     $result = array(); 
    334     foreach($users as $index => $user){ 
    335         $user_ids[] = $user->ID; 
    336         $result[$user->ID] = $user; 
    337         unset($users[$index]); 
    338     } 
    339      
    340     unset($users); 
    341      
    342     // seleciona os metadados to usuário 
    343     $user_ids = implode(',', $user_ids); 
    344      
    345     $user_ids = $user_ids ? $user_ids : '-1'; 
    346      
    347     $metakeys = array(); 
    348     $metakeys = array_keys($wpue_config->metadata); 
    349     if(!in_array($wpdb->prefix.'capabilities', $metakeys)) 
    350             $metakeys[] = $wpdb->prefix.'capabilities'; 
    351      
    352     $metakeys = "'".implode("','", $metakeys)."'"; 
    353      
    354     $qm = " 
    355         SELECT 
    356             user_id, 
    357             meta_key, 
    358             meta_value 
    359         FROM 
    360             $wpdb->usermeta 
    361         WHERE 
    362             meta_key IN ($metakeys) AND 
    363             user_id IN ($user_ids)"; 
    364      
    365     $rs = mysql_query($qm) or die($qm); 
    366     while ($metadata = mysql_fetch_object($rs)){ 
    367         $meta_key = $metadata->meta_key; 
    368         $meta_value = $metadata->meta_value; 
    369         $user_id = $metadata->user_id; 
    370          
    371         if(is_serialized($meta_value)){ 
    372             $meta_value = unserialize ($meta_value); 
    373              
    374             if($meta_key == $wpdb->prefix.'capabilities' && $DISPLAY_ROLE){ 
    375                 $user_roles = ''; 
    376                 $capabilities = array_keys($meta_value); 
    377                 foreach($capabilities as $i => $cap){ 
    378                     if(in_array($cap, $roles)) 
    379                         $user_roles = $user_roles ? ', '.$cap : $cap; 
     335     
     336    $count_q = "SELECT count(ID) $base_q"; 
     337     
     338    $count = $wpdb->get_var($count_q); 
     339     
     340    for ($ii = 0; $ii <= $count; $ii += $step) { 
     341     
     342        $q = "SELECT $cols $base_q LIMIT $step OFFSET $ii"; 
     343         
     344                   
     345        $users = $wpdb->get_results($q); 
     346 
     347        $wpue_config = wpue_getConfig(); 
     348        $user_ids = array(); 
     349        // limpa o usuário, removendo as propriedades que não foram selecionadas no formulario 
     350        // de exportação 
     351        unset($result); 
     352        $result = array(); 
     353        foreach($users as $index => $user){ 
     354            $user_ids[] = $user->ID; 
     355            $result[$user->ID] = $user; 
     356            unset($users[$index]); 
     357        } 
     358         
     359        unset($users); 
     360         
     361        // seleciona os metadados to usuário 
     362        $user_ids = implode(',', $user_ids); 
     363         
     364        $user_ids = $user_ids ? $user_ids : '-1'; 
     365         
     366        $metakeys = array(); 
     367        $metakeys = array_keys($wpue_config->metadata); 
     368        if(!in_array($wpdb->prefix.'capabilities', $metakeys)) 
     369                $metakeys[] = $wpdb->prefix.'capabilities'; 
     370         
     371        $metakeys = "'".implode("','", $metakeys)."'"; 
     372         
     373        $qm = " 
     374            SELECT 
     375                user_id, 
     376                meta_key, 
     377                meta_value 
     378            FROM 
     379                $wpdb->usermeta 
     380            WHERE 
     381                meta_key IN ($metakeys) AND 
     382                user_id IN ($user_ids)"; 
     383         
     384        $rs = mysql_query($qm) or die($qm); 
     385        while ($metadata = mysql_fetch_object($rs)){ 
     386            $meta_key = $metadata->meta_key; 
     387            $meta_value = $metadata->meta_value; 
     388            $user_id = $metadata->user_id; 
     389             
     390            if(is_serialized($meta_value)){ 
     391                $meta_value = unserialize ($meta_value); 
     392                 
     393                if($meta_key == $wpdb->prefix.'capabilities' && $DISPLAY_ROLE){ 
     394                    $user_roles = ''; 
     395                    $capabilities = array_keys($meta_value); 
     396                    foreach($capabilities as $i => $cap){ 
     397                        if(in_array($cap, $roles)) 
     398                            $user_roles = $user_roles ? ', '.$cap : $cap; 
     399                         
     400                        if(!$meta_value[$cap]) 
     401                            unset($capabilities[$i]); 
     402                    } 
     403                    $__role = __ROLE__; 
     404                    $result[$user_id]->$__role = $user_roles; 
    380405                     
    381                     if(!$meta_value[$cap]) 
    382                         unset($capabilities[$i]); 
    383                 } 
    384                 $__role = __ROLE__; 
    385                 $result[$user_id]->$__role = $user_roles; 
    386                  
    387                 $meta_value = $capabilities; 
     406                    $meta_value = $capabilities; 
     407                } 
     408            } 
     409             
     410            $result[$user_id]->$meta_key = isset($result[$user_id]->$meta_key) ? ($result[$user_id]->$meta_key).", ".$meta_value : $meta_value; 
     411             
     412            if(is_object($result[$user_id]->$meta_key)) 
     413                $result[$user_id]->$meta_key = (array) $result[$user_id]->$meta_key; 
     414                 
     415            if(is_array($result[$user_id]->$meta_key)) 
     416                $result[$user_id]->$meta_key = implode(', ', $result[$user_id]->$meta_key); 
     417                 
     418        } 
     419         
     420         
     421        /* BUDDYPRESS EDITION */ 
     422         
     423        if(wpue_isBP()){ 
     424            $field_ids = implode(',', $wpue_config->bp_fields); 
     425             
     426            $bp_fields = wpue_bp_getProfileFields(); 
     427             
     428            $bp_data_query = " 
     429            SELECT  
     430                *  
     431            FROM  
     432                {$wpdb->prefix}bp_xprofile_data  
     433            WHERE  
     434                user_id IN ($user_ids) AND  
     435                field_id IN ($field_ids) 
     436            ORDER BY  
     437                user_id ASC"; 
     438             
     439             
     440            $bp_data = $wpdb->get_results($bp_data_query); 
     441             
     442             
     443            foreach ($bp_data as $data){ 
     444                $field = 'bp_'.$data->field_id; 
     445                if($bp_fields[$data->field_id]->type == 'datebox') 
     446                    $data->value = date($wpue_config->date_format, $data->value); 
     447                     
     448                if(is_serialized($data->value)) 
     449                    $data->value = unserialize($data->value); 
     450                     
     451                if(is_object($data->value)) 
     452                    $data->value = (array) $data->value; 
     453                 
     454                if(is_array($data->value)) 
     455                    $data->value = implode(', ', $data->value); 
     456                     
     457                $result[$data->user_id]->$field = $data->value; 
    388458            } 
    389459        } 
    390460         
    391         //if() 
    392          
    393         $result[$user_id]->$meta_key = isset($result[$user_id]->$meta_key) ? ($result[$user_id]->$meta_key).", ".$meta_value : $meta_value; 
    394          
    395         if(is_object($result[$user_id]->$meta_key)) 
    396             $result[$user_id]->$meta_key = (array) $result[$user_id]->$meta_key; 
    397              
    398         if(is_array($result[$user_id]->$meta_key)) 
    399             $result[$user_id]->$meta_key = implode(', ', $result[$user_id]->$meta_key); 
    400              
    401     } 
    402      
    403      
    404     /* BUDDYPRESS EDITION */ 
    405      
    406     if(wpue_isBP()){ 
    407         $field_ids = implode(',', $wpue_config->bp_fields); 
    408          
    409         $bp_fields = wpue_bp_getProfileFields(); 
    410          
    411         $bp_data_query = " 
    412         SELECT  
    413             *  
    414         FROM  
    415             {$wpdb->prefix}bp_xprofile_data  
    416         WHERE  
    417             user_id IN ($user_ids) AND  
    418             field_id IN ($field_ids) 
    419         ORDER BY  
    420             user_id ASC"; 
    421          
    422          
    423         $bp_data = $wpdb->get_results($bp_data_query); 
    424          
    425          
    426         foreach ($bp_data as $data){ 
    427             $field = 'bp_'.$data->field_id; 
    428             if($bp_fields[$data->field_id]->type == 'datebox') 
    429                 $data->value = date($wpue_config->date_format, $data->value); 
    430                  
    431             if(is_serialized($data->value)) 
    432                 $data->value = unserialize($data->value); 
    433                  
    434             if(is_object($data->value)) 
    435                 $data->value = (array) $data->value; 
    436              
    437             if(is_array($data->value)) 
    438                 $data->value = implode(', ', $data->value); 
    439                  
    440             $result[$data->user_id]->$field = $data->value; 
    441         } 
    442     } 
    443      
    444     return $result; 
     461        $result_string = ''; 
     462         
     463        foreach ($result as $id => $r) { 
     464            $result_string .= str_replace("\r\n", '||BR||', serialize($r)) . "\n"; 
     465        } 
     466         
     467         
     468        //$result_string = str_replace("\r", '', $result_string); 
     469        file_put_contents($tmpfile, $result_string, FILE_APPEND); 
     470         
     471         
     472         
     473         
     474     
     475    } // end for 
     476     
     477     
     478    return $tmpfile; 
    445479} 
    446480 
Note: See TracChangeset for help on using the changeset viewer.