2013-08-05 38 views
8

Tôi có tập lệnh tạo một bảng xls nhỏ (~ 25x15). Nó chứa tỷ lệ phần trăm và chuỗi và tôi có một nếu nhà điều hành mà đặt ô hiện as type tỷ lệ với mã này:PhpExcel ngừng hoạt động sau khi cài đặt 20 loại ô

$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%'); 

Nhưng khi tôi xuất khẩu và nhìn vào các tập tin tôi thấy nó chỉ quản lý để thiết lập loại và phong cách về 20 ô. Và tất cả các phần còn lại đều có cài đặt mặc định. Tôi đã sửa lỗi nó và nhận ra rằng vấn đề không nằm trong logic của tôi. Tôi đọc về việc tăng bộ nhớ cache của bộ nhớ cache - đã thử nó nhưng nó không hoạt động. Xin vui lòng giúp đỡ vì tôi cần phải xuất khẩu ít nhất 15 lần bảng lớn hơn. Cảm ơn trước!

+1

Vì PHPExcel không áp đặt bất kỳ giới hạn nào về số kiểu (mặc dù Excel tự thực hiện, nó cao hơn 20) và một số tập lệnh demo trong thư mục/Examples sử dụng hơn 20 kiểu khác nhau, bạn có thể vui lòng cung cấp ví dụ về mã hoạt động thể hiện vấn đề này không. Nó có thể là vấn đề là trong một phong cách cụ thể mà bạn đang thiết lập chứ không phải là sau một số phong cách. –

+0

'$ this' trong câu hỏi của bạn là gì và' $ coords' trong câu hỏi của bạn là gì và phần còn lại của ví dụ tối thiểu để tái tạo vấn đề của bạn ở đâu? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions – hakre

Trả lời

1
<?php 
$file = 'output_log.txt'; 

function get_owner($file) 
{ 
    $stat = stat($file); 
    $user = posix_getpwuid($stat['uid']); 
    return $user['name']; 
} 

$format = "UID @ %s: %s\n"; 

printf($format, date('r'), get_owner($file)); 

chown($file, 'ross'); 
printf($format, date('r'), get_owner($file)); 

clearstatcache(); 
printf($format, date('r'), get_owner($file)); 
?> 

clearstatcache(); có thể hữu ích. Tải chức năng này ở đầu trang php.

+0

Tôi đã thử nó nhưng nó không hoạt động. Đây là mã tôi đang sử dụng http://pastebin.com/wjWuX8J0. Tôi sẽ được đánh giá cao nếu bạn quản lý để đưa ra bất kỳ lời khuyên nào khác. – Martin

3

PHPExcel phân bổ khá nhiều bộ nhớ

Trong khi PHPExcel là một thư viện đẹp, sử dụng nó có thể yêu cầu một lượng lớn bộ nhớ phân bổ cho PHP.

Theo this thread, chỉ 5 tế bào có thể làm cho 6 MByte sử dụng bộ nhớ:

<?php 
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php'; 
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx"); 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50); 
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . " 
"; 
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB\r\n"; 
?> 

I get 6MB of memory usage. 

Một khung cảnh user even failed with a 256MByte memory.

Trong khi PHPExcel cung cấp các cách để giảm bớt dung lượng bộ nhớ của nó, tất cả các khoản giảm đều trở nên quá nhỏ trong trường hợp của tôi. This page on github cung cấp chi tiết về các tùy chọn quản lý bộ nhớ cache của PHPExcel. Ví dụ, thiết lập này serializes và GZIPs các tế bào cấu trúc của một bảng tính:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

PHPExcel's FAQ giải thích điều này:

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa

PHPExcel holds an "in memory" representation of a spreadsheet, so it is susceptible to PHP's memory limitations. The memory made available to PHP can be increased by editing the value of the memorylimit directive in your php.ini file, or by using iniset('memory_limit', '128M') within your code (ISP permitting);

Some Readers and Writers are faster than others, and they also use differing amounts of memory. You can find some indication of the relative performance and memory usage for the different Readers and Writers, over the different versions of PHPExcel, here http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150

If you've already increased memory to a maximum, or can't change your memory limit, then this discussion on the board describes some of the methods that can be applied to reduce the memory usage of your scripts using PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712

kết quả đo cho PHP Excel

tôi instrumented các PHPExcel ví dụ: [01simple.php][5] và đã thực hiện một số thử nghiệm nhanh .

Tiêu thụ 92 Kbyte:

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
} 

Tiêu thụ 4164 KBytes:

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
    $objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true); 
} 

Nếu một thực thi đoạn này nhiều lần thay đổi, mỗi mảnh tiêu thụ khoảng 4 MByte.

Kiểm tra ứng dụng của bạn một cách logic đúng

Để đảm bảo rằng ứng dụng của bạn một cách logic đúng, tôi muốn đề nghị để tăng bộ nhớ PHP đầu tiên:

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

Trong trường hợp của tôi, tôi phải xuất để xuất dữ liệu kết quả của một ứng dụng đánh giá trực tuyến.Trong khi có ít hơn 100 ô theo chiều ngang, tôi cần xuất tối đa 10.000 hàng. Trong khi số lượng ô lớn, mỗi ô của tôi giữ một số hoặc một chuỗi gồm 3 ký tự - không có công thức, không có kiểu.

Trong trường hợp hạn chế bộ nhớ mạnh hoặc bảng tính lớn

Trong trường hợp của tôi, không ai trong số các tùy chọn bộ nhớ cache giảm số tiền càng nhiều càng tốt yêu cầu. Thêm vào đó, thời gian chạy của ứng dụng tăng lên rất nhiều.

Cuối cùng, tôi phải chuyển sang xuất tệp tin CSV-dữ liệu cũ.

+1

Vui lòng trích dẫn tham chiếu của bạn cho 'Mỗi ô của một bảng tính PHPExcel chiếm khoảng 20 KB bộ nhớ.' ... quy tắc của tôi luôn là 1k/ô trên PHP 32 bit và 1.6k/ô nếu bạn đang sử dụng 64-bit PHP –

+0

Điều này dường như ít hơn một chút so với một rant chống lại PHPExcel quản lý bộ nhớ, và dường như không trả lời câu hỏi của OP về phong cách trong bất kỳ cách nào. OP không đề cập đến bộ nhớ. Và nó hầu như không đề cập đến bất kỳ kỹ thuật nào để giảm thiểu việc sử dụng bộ nhớ trong PHPExcel –

+0

Vấn đề với COM, và lý do tại sao MS không đề xuất nó, là nó gây ra vấn đề khi bạn đang cố gắng làm việc với nhiều hơn một đối tượng COM (hoặc nhiều hơn một tệp Excel) tại một thời điểm ....nhưng nó cũng bị giới hạn đối với các máy chủ Windows –

2

Tôi đã chạy mã của bạn cục bộ và nhận thấy rằng tất cả 26 ô bạn đặt thành phần trăm này đều có định dạng phù hợp và ký hiệu%. Dĩ nhiên tôi phải bỏ dòng 136-137 đầu tiên.

Điều này phải liên quan đến thiết lập của bạn. Tôi không thể tưởng tượng bạn có quá ít bộ nhớ cho một bảng tính có kích thước này.

Để biết thông tin của bạn, tôi xác nhận rằng nó đã hoạt động trên phiên bản PHP 5.4.16 với phiên bản php excel phiên bản 1.7.6, 2011-02-27. Tôi đã mở bảng tính bằng MS Excel 2007.

+0

Cũng có phiên bản mới nhất, 1.7.9. 17:01:54 Sử dụng bộ nhớ hiện tại: 5.5 MB 17:01:54 Sử dụng bộ nhớ tối đa: 5,5 MB – Spork

+1

có nghĩa là, tập lệnh hoạt động trên máy của bạn và không hoạt động trên máy của tôi ... – Martin

+0

Nó chỉ có thể là máy phụ thuộc nếu nó là bộ nhớ, nhưng tôi không có một cỗ máy đặc biệt ấn tượng. Tôi sẽ dựa vào sự khác biệt trong các phiên bản PHP hoặc các phiên bản PHPExcel. Cái nào là của bạn? – Spork

Các vấn đề liên quan