2012-01-31 26 views
5

Tôi đang cố gắng tăng bộ nhớ cho phép đối với một số tập lệnh PHP nhất định. Không có vấn đề gì tôi làm, ví dụ này:PHP không thể sử dụng 300MB RAM

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

... kịch bản luôn chạy ra khỏi bộ nhớ vào khoảng 300MB:

Fatal error: Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) in \\Foo\phpQuery\phpQuery.php on line 255 

tôi đã xác minh bởi nhiều có nghĩa là memory_limit là thực sự thay đổi . Vấn đề có vẻ là PHP không thể phân bổ tổng cộng 300   MB bộ nhớ (25165824   byte + 343810589   bytes = 352   MB).

Tôi đã thử cả hai PHP/5.3.0 và PHP/5.3.9 trong hai máy tính dựa trên Windows khác nhau với các thông số kỹ thuật sau:

  • Windows XP/Windows Server 2003 (cả hai máy tính là 32 hộp bit với 1GB hoặc RAM)
  • chính thức PHP 32-bit VC9 binaries
  • Chạy như Apache 2.2 mô-đun (bên thứ ba 32-bit VC9 nhị phân)

tôi hiểu rằng việc sử dụng một nửa của bộ nhớ RAM vật lý sẽ buộc swa pping và làm chậm những thứ xuống địa ngục nhưng tôi chỉ cần chắc chắn rằng kịch bản thực sự hoạt động để nó có thể được triển khai đến máy chủ trực tiếp. Tôi cũng đã cố gắng giá trị lớn hơn (mà procuded cùng một lỗi) và các giá trị nhỏ hơn (với một trong hai làm cho kịch bản của tôi đạt đến giới hạn hoặc làm cho Apache sụp đổ).

Điều gì có thể là nguồn gốc của giới hạn bộ nhớ được mã hóa rõ ràng này?

Cập nhật # 1: Tôi đã thử nghiệm thêm với hộp Windows Server 2003 (thực tế là máy ảo VMWare). Tôi đã tăng RAM "vật lý" lên 2   GB và tôi đã xác minh rằng tệp hoán trang được phép tăng lên tới 1152   MB. Trình quản lý tác vụ cho biết tải giao dịch hiện tại là 886   MB và có 1,5   GB bộ nhớ vật lý miễn phí. Tuy nhiên, tôi nhận được cùng một lỗi với chính xác cùng một số liệu.

Cập nhật # 2: Như tôi đã nói, chỉ thị memory_limit là tốt. Nó hiển thị trong cả hai số ini_get()phpinfo(). Thông báo lỗi bạn nhận được hơi khác so với thông báo lỗi của tôi; của tôi cho biết lỗi PHP. Hãy so sánh:

Out of memory (allocated 25165824) (tried to allocate 343810589 bytes) 
Allowed memory size of 25165824 bytes exhausted (tried to allocate 343810589 bytes) 

Tôi sẽ cố gắng soạn kịch bản để tạo lại vấn đề và báo cáo lại.

+0

Nếu PHP đang cố gắng lấy nhiều bộ nhớ trong một lần, thì tôi giả sử bạn đang cố gắng tải một tệp .... thử tải tệp theo khối hơn là trong một lần –

+0

«Nếu bạn không thể tối ưu hóa , mua thêm RAM ... »Vâng, một thời gian nó sai ...; Bạn có chắc bạn cần tất cả bộ nhớ đó không? 300MB là một số tiền khổng lồ rồi. Có lẽ bạn có thể tối ưu hóa tập lệnh của mình một chút ... – Macmade

+2

Bạn có chắc chắn 100% hệ điều hành có bộ nhớ miễn phí hơn 300MB để phân bổ không? – DaveRandom

Trả lời

4

Ngoại lệ OOM khác với cảnh báo giới hạn bộ nhớ.

Điều này có nghĩa là PHP không thể phân bổ bộ nhớ vì không có đủ tài nguyên trong hệ điều hành của bạn.

Bạn sẽ cần phải kiểm tra hệ thống có đủ bộ nhớ/phân trang có sẵn để hỗ trợ điều này không.

+0

Tôi đã cập nhật câu hỏi. Máy chủ, rõ ràng, có đủ bộ nhớ. –

0

Hãy thử với max_input_time, đôi khi PHP nói memory_limit nó thực sự có nghĩa max_input_time (-1 là vô hạn cho một này).

+0

Điểm tốt. Nhưng giá trị đã được đặt thành 20 phút và sự cố xảy ra trước đó. Tôi đã không làm việc này kể từ khi tôi thực hiện các câu hỏi nhưng tôi biết rằng sớm hay muộn tôi sẽ cần phải sửa mã để nó không cần bộ nhớ rất nhiều ở nơi đầu tiên. –

+0

Uhmm sau đó tôi không thể giúp được nữa! – R01010010

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