2008-10-05 28 views
11

Tôi đang viết một kịch bản php nơi tôi gọisố lượng tối đa các phím cho một mảng trong php

$lines = file('base_list.txt'); 

để phá vỡ một tập tin thành một mảng là gì. Tệp có hơn 100.000 dòng trong đó, có 100.000 phần tử trong mảng, nhưng khi tôi chạy

print_r($lines); 
exit; 

mảng chỉ chứa 7280 phần tử.

Vì vậy, tôi tò mò, WTF? Có giới hạn về số lượng chìa khóa mà một mảng có thể có không? Tôi đang chạy này tại địa phương trên một lõi kép 2.0Ghz với 2GB RAM (Vista & IIS mặc dù); Vì vậy, tôi là một chút bối rối như thế nào một tập tin 4MB có thể ném kết quả như thế này.

Chỉnh sửa: Tôi có lẽ đã đề cập đến rằng trước đó tôi đã đặt memory_limit thành 512MB trong php.ini.

+0

Nếu bạn kiểm tra số phần tử trong mảng có số lượng, nó cũng chỉ báo cáo 7280? – Cory

+0

* (liên quan) * [HashTables] (http://schlueters.de/blog/archives/142-HashTables.html) – Gordon

Trả lời

2

Tôi tin rằng nó dựa trên lượng bộ nhớ khả dụng như được đặt trong tệp php.ini.

+0

Bạn sẽ không mong đợi một ngoại lệ hay điều gì đó nếu một tệp vượt quá giới hạn bộ nhớ đó? –

+0

Không thực sự. Người phiên dịch sẽ dọn sạch mọi thứ có thể, và ngăn chặn bất kỳ sự tiêu thụ bổ sung nào; ngoài ra, nó có thể ghi lại sự xuất hiện. –

5

Chỉnh sửa: Như Rob đã nói, nếu ứng dụng của bạn hết bộ nhớ, rất có thể thậm chí nó sẽ không đến được dòng print_r. Đó cũng là linh cảm của tôi, nhưng nếu nó vấn đề về bộ nhớ, những điều sau đây có thể hữu ích.

Hãy xem tệp php.ini cho dòng này và có thể tăng lên 16 hoặc nhiều hơn.

memory_limit = 8M 

Nếu bạn không có quyền truy cập vào php.ini (ví dụ nếu điều này là xảy ra trên một máy chủ chia sẻ), bạn có thể sửa chữa nó với một tập tin .htaccess như thế này

php_value memory_limit 16M 

Rõ ràng một số máy chủ không cho phép bạn làm điều này mặc dù.

1

Tôi sẽ đồng ý với Cory. Tôi nghĩ rằng PHP của bạn có lẽ là cấu hình bộ nhớ mặc định của 8MB, mà 4MB x 2 đã được nhiều hơn nữa. Lý do cho x2 là bởi vì bạn phải tải tập tin, sau đó để tạo mảng bạn cần phải có các tập tin trong bộ nhớ một lần nữa. Tôi chỉ đoán, nhưng điều đó sẽ có ý nghĩa.

Bạn có chắc chắn PHP không ghi lại lỗi không?

3

Có thể có giới hạn vốn có trên đầu ra từ print_r. Tôi muốn đề nghị tìm kiếm dòng đầu tiên và cuối cùng trong tập tin để xem chúng có nằm trong mảng hay không. Nếu bạn đã nhấn một giới hạn bộ nhớ chèn vào mảng bạn sẽ không bao giờ nhận được vào dòng print_r.

3

Hai gợi ý:

  1. Đếm số thực tế các mặt hàng trong mảng và xem có hay không các mảng là con số chính xác các mục (do đó loại trừ hoặc xác định print_r() là thủ phạm)

  2. Xác minh đầu vào ... có khả năng kết thúc dòng trong tệp đang gây ra sự cố không? Ví dụ: có sự kết hợp các loại kết thúc dòng khác nhau không? Xem manual page for file() và ghi chú về cài đặt auto_detect_line_endings, mặc dù điều này có thể không liên quan đến kết thúc dòng mac.

2

mỗi khi i hết bộ nhớ trong PHP, tôi đã nhận được thông báo lỗi cho biết thực tế đó. Vì vậy, tôi cũng muốn nói rằng nếu bạn đang chạy ra khỏi bộ nhớ sau đó kịch bản sẽ không nhận được để các print_r()

thử cho phép auto_detect_line_endings trong php.ini hoặc bằng cách sử dụng
ini_set('auto_detect_line_endings', 1). Có thể có một số kết thúc dòng mà các cửa sổ không hiểu được & tùy chọn ini này có thể hữu ích. biết thêm về tùy chọn ini này có thể được tìm thấy here

2

Bạn nên sử dụng count để đếm số lượng các mục trong một mảng, không print_r. Điều gì sẽ xảy ra nếu đầu ra của mảng lớn này bị hủy bỏ vì hết thời gian chờ hoặc cái gì khác? Hoặc một số lỗi/tính năng trong print_r?

6

Darryl Hein,

Vâng, không có gì trong nhật ký lỗi. Tôi thậm chí còn tăng báo cáo lỗi và vẫn không có gì liên quan đến print_r().

Để đối phó với Jay: Tôi chạy

echo count($lines); 

và tôi nhận được một kết quả của 105.546 nhưng vẫn print_r() chỉ hiển thị 7280.

Lấy lời khuyên Rob Walker của tôi looped trên tất cả các yếu tố trong mảng và nó thực sự chứa tất cả các kết quả. Điều này khiến tôi tin rằng vấn đề là với print_r() chính nó thay vì giới hạn kích thước mảng.

Một điều kỳ lạ khác là tôi đã thử trên một trong các máy chủ REHL của mình và kết quả là như mong muốn. Bây giờ tôi không muốn đổ lỗi cho điều này trên Windows/IIS nhưng có bạn đi.

Với ý nghĩ trên, tôi nghĩ câu hỏi này nên được đặt lại tên vì nó không còn liên quan đến mảng nhưng print_r.

+0

điều này khá hữu ích để biết .. có thể bạn có thể đặt câu trả lời này là câu trả lời của cộng đồng để bạn có thể chấp nhận câu trả lời đó. – paan

+0

Trên http: //au.php.net/print_r có một số thay thế cho print_r mà nên hoạt động chính xác (giả sử đó là một giới hạn của print_r) – dbr

1

Nếu bạn xuất ra một cái gì đó như Internet Explorer, bạn có thể muốn đảm bảo rằng nó có thể hiển thị tất cả thông tin bạn đang cố gắng đặt ở đó. Tôi biết có một giới hạn cho một trang html, nhưng tôi không chắc nó là gì.

2

Chức năng print_r của PHP không có giới hạn. Tuy nhiên, ngay cả khi bạn không "nhìn thấy" toàn bộ mảng được in, nó là tất cả ở đó. Tôi đã vật lộn với cùng một vấn đề này khi in các đối tượng dữ liệu lớn.

Điều này làm cho việc gỡ lỗi trở nên khó khăn, nếu bạn phải xem toàn bộ mảng, bạn có thể tạo vòng lặp để in mọi dòng.

foreach ($FileLines as $Line) echo $Line; 

Điều đó sẽ cho phép bạn xem tất cả các dòng mà không bị giới hạn.

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