2017-12-11 3 views
0

일부 계산을하고 결과를 다운로드하려고합니다. 헤더를 사용하고 있지만 결과는 꽤 커서 메모리 문제가 있습니다. 여기 헤더를 사용하여 파일을 부분적으로 다운로드하십시오.

내 코드 헤더 코드 :

function download_send_headers($filename) { 
    // disable caching 
    $now = gmdate("D, d M Y H:i:s"); 
    header("Expires: Tue, 03 Jul 2020 06:00:00 GMT"); 
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate"); 
    header("Last-Modified: {$now} GMT"); 

    // force download 
    header("Content-Type: application/force-download"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Type: application/download"); 

    // disposition/encoding on response body 
    header("Content-Disposition: attachment;filename={$filename}"); 
    header("Content-Transfer-Encoding: binary"); 
} 

그리고 여기에 문제를 얻고있는 곳입니다 :

$export_model->download_send_headers('tainacan_csv.csv'); 
foreach($objects as $object) 
{ 
     $csv_data = $export_model->generate_csv_data($data, $object); 
     echo utf8_decode($export_model->array2csv($csv_data, $data['socialdb_delimiter_csv'])); 
} 

더 코드, 나는 선으로, 심지어 그렇게 줄을 내 aproach 변경 기억에 문제가 생겼어. 이것은 CSV를 생성하는 코드입니다. 과 같이 ini_set(); :

public function generate_csv_data($data) { 

    $df = fopen("php://output", 'w'); 

    $propertyModel = new PropertyModel; 
    $objects = $this->get_collection_posts($data['collection_id']); 
    $facets = CollectionModel::get_facets($data['collection_id']); 

    //fputcsv($df, array_keys(reset($objects)), $data['socialdb_delimiter_csv']); 

    foreach ($objects as $object) { 
     $csv_data = []; 
     if ($object->ID == $data['collection_id']) { 
      continue; 
     } 

     /** ID * */ 
     if ($object->ID != "") { 
      $csv_data['ID'] = $object->ID; 
     } 

     /** Title * */ 
     if ($object->post_title != "") { 
      $value = $object->post_title; 
      if(mb_detect_encoding($value)==='UTF-8'){ 
       $value = utf8_decode($value); 
      } 
      $csv_data['title'] = $value; 
     } else { 
      $csv_data['title'] = ''; 
     } 

     /** Description * */ 
     if ($object->post_content != "") { 
      $value = $object->post_content; 
      if(mb_detect_encoding($value)==='UTF-8'){ 
       $value = utf8_decode($value); 
      } 
      $csv_data['description'] = $value; 
     } else { 
      $csv_data['description'] = ''; 
     } 

     /** Content * */ 
     if (get_post_meta($object->ID, 'socialdb_object_content', true) != "") { 
      $csv_data['content'] = utf8_decode(get_post_meta($object->ID, 'socialdb_object_content', true)); 
      if ($csv_data['content'] != '' && is_numeric($csv_data['content'])) { 
       $csv_data['content'] = wp_get_attachment_url($csv_data['content']); 
      } 
     } else { 
      $csv_data['content'] = ''; 
     } 

     /** Origin * */ 
     if (get_post_meta($object->ID, 'socialdb_object_from')) { 
      $csv_data['item_from'] = get_post_meta($object->ID, 'socialdb_object_from', true); 
     } 

     /** Type * */ 
     if (get_post_meta($object->ID, 'socialdb_object_dc_type')) { 
      $csv_data['item_type'] = get_post_meta($object->ID, 'socialdb_object_dc_type', true); 
     } 

     /** Source * */ 
     if (get_post_meta($object->ID, 'socialdb_object_dc_source')) { 
      $value = get_post_meta($object->ID, 'socialdb_object_dc_source', true); 
      if(mb_detect_encoding($value)==='UTF-8'){ 
       $value = utf8_decode($value); 
      } 
      $csv_data['item_source'] = $value; 
     } 

     /** URL * */ 
     if (get_post_meta($object->ID, 'socialdb_uri_imported')) { 
      $csv_data['permalink'] = get_post_meta($object->ID, 'socialdb_uri_imported', true); 
     } else { 
      $csv_data['permalink'] = get_the_permalink($data['collection_id']) . '?object_id=' . $object->ID; 
     } 

     /** Tags * */ 
     $tags = wp_get_object_terms($object->ID, 'socialdb_tag_type', array('fields' => 'names')); 
     if (!empty($tags)) { 
      $csv_data['tags'] = utf8_decode(implode('||', $tags)); 
     } else { 
      $csv_data['tags'] = ''; 
     } 

     /** Categories * */ 
     $categories_of_facet = array(); 
     $category_model = new CategoryModel; 
     $categories = wp_get_object_terms($object->ID, 'socialdb_category_type'); 
     if (is_array($categories)): 
      foreach ($categories as $category) { 
       $facet_id = $category_model->get_category_facet_parent($category->term_id, $data['collection_id']); 
       if (!isset($facet_id) || $facet_id == $category->term_id) { 
        continue; 
       } 
       $categories_of_facet[$facet_id][] = $this->get_hierarchy_names($category->term_id, $facet_id); 
      } 
     endif; 

     if ($facets) { 
      foreach ($facets as $facet) { 
       $term = get_term_by('id', $facet, 'socialdb_category_type'); 
       if (is_array($categories_of_facet[$facet])): 
        $csv_data[utf8_decode($term->name)] = utf8_decode(implode(', ', $categories_of_facet[$facet])); 
       else: 
        $csv_data[utf8_decode($term->name)] = ''; 
       endif; 
      } 
     } 

     /** Propriedades de Atributos * */ 
     $root_category = $this->get_category_root_of($data['collection_id']); 

     //$all_properties_id = get_term_meta($root_category, 'socialdb_category_property_id'); 
     $all_properties_id = array_unique($this->get_parent_properties($root_category, [], $root_category)); 
     if ($all_properties_id) { 
      foreach ($all_properties_id as $property_id) { 
       $property = get_term_by("id", $property_id, "socialdb_property_type"); 
       if (in_array($property->slug, $this->fixed_slugs)): 
        continue; 
       endif; 
       $type = $propertyModel->get_property_type($property_id); // pego o tipo da propriedade 
       if ($type == 'socialdb_property_data') { 
        $value = get_post_meta($object->ID, 'socialdb_property_' . $property_id, true); 
        if(mb_detect_encoding($value)==='UTF-8'){ 
         $value = utf8_decode($value); 
        } 
        $csv_data[utf8_decode($property->name)] = get_post_meta($object->ID, 'socialdb_property_' . $property_id, true); 
       } elseif ($type == 'socialdb_property_object') { 
        $property_result_meta_value = get_post_meta($object->ID, 'socialdb_property_' . $property_id); 
        if (is_array($property_result_meta_value) && $property_result_meta_value[0] != '') { 
         foreach ($property_result_meta_value as $property_meta_value) { 
          $array_property_name[] = get_post($property_meta_value)->post_title; 
         } 
         $csv_data[utf8_decode($property->name)] = utf8_decode(implode(', ', $array_property_name)); 
        } else { 
         $csv_data[utf8_decode($property->name)] = ''; 
        } 
       } 
      } 
      $array_property_name = []; 
     } 

     /** Arquivos * */ 
     $array_files = $this->list_files_to_export($object->ID); 
     if ($array_files) { 
      $csv_data['Files'] = implode(', ', $array_files); 
     } else { 
      $csv_data['Files'] = ''; 
     } 


     /**    * ************************** */ 
     //$csv[] = $csv_data; 

     fputcsv($df, $csv_data, $data['socialdb_delimiter_csv']); 
     unset($csv_data); 
    } 
    fclose($df); 
    //return $csv; 
} 
+1

아마'generate_csv_data'는 당신이 CSV로 변환하는 큰 배열을 생성합니다. 이상적으로'generate_csv_data'가 실제 CSV 데이터를 생성하고 그것을 한 줄씩 echo해야합니다. – apokryfos

+0

tryed는 이렇게 한 줄 단위로 처리하지만 아파치는 cosume 메모리를 멈추지 않습니다. 580MB의 메모리에서 멈 춥니 다. –

+0

출력 버퍼링이 활성화 된 경우 비활성화해야합니다. – apokryfos

답변

1

당신은 함께 메모리 제한을 변경할 수 있습니다

ini_set('memory_limit', '2048M'); 

편집 : 나는 @apokryfos에 동의합니다. 보다 자세한 솔루션을 원한다면 더 많은 코드가 필요합니다.

+0

이것은 "돈을 버는 것"솔루션으로 알려져 있습니다. 불행히도 모든 사람이 그것을 감당할 수는 없습니다. (이 맥락에서 돈은 유한 자원을 상징한다) – apokryfos

+0

그리고 나를 위해 일하지 않는다. –