2012-09-06 51 views
9

Tôi có một tập lệnh php chạy trong khoảng 2 giờ. Đó là một công việc cron. Công việc cron chạy cứ 4 giờ một lần.memory_limit: Tính năng này hoạt động như thế nào?

Ở cuối tập lệnh, tôi hiển thị một số giá trị bộ nhớ.

The memory_get_usage() result is 881568 Bytes (0.840766906738M) 
The memory_get_peak_usage() result is 1340304 Bytes (1.27821350098M) 
The memory_get_usage(true) result is 1572864 Bytes (1.5M) 
The memory_get_peak_usage(true) result is 1835008 Bytes (1.75M) 

Memory_limit in php.ini là 128M và không hoạt động. Tôi nâng nó lên 256M và bây giờ nó hoạt động.

Nhưng khi đỉnh bộ nhớ của tập lệnh nhỏ hơn 2M ....

Vậy tham số memory_limit hoạt động như thế nào?

Có phải tổng bộ nhớ được tập lệnh sử dụng không? Nếu vậy, làm thế nào tôi có thể tính toán nó?

Đây có phải là đỉnh bộ nhớ của tập lệnh không? nếu vậy, tôi tính toán nó phải không?

Tôi đang sử dụng php 5.3.16.

EDIT

tôi không có bất kỳ thông báo lỗi. Khi giới hạn là 128M Kịch bản thực hiện, nhưng không bao giờ kết thúc.

+0

còn bạn đang chạy trên cùng một máy chủ khác? –

+0

Nếu tập lệnh của bạn bị lỗi với lỗi giới hạn bộ nhớ, bạn thấy thông báo tường trình như thế nào? – galymzhan

+0

@galymzhan Nó đã không sụp đổ khi giới hạn đã được tăng lên đến 256MB, nó bị rơi khi nó được thiết lập để 128MB. Tuy nhiên bây giờ nó được thiết lập để 256MB Marm thấy rằng việc sử dụng bộ nhớ cao điểm là không có nơi gần giới hạn 128MB, câu hỏi của ông là như vậy tại sao ông cần phải tăng giới hạn để làm cho nó hoạt động? – Lee

Trả lời

4

Thử sử dụng chức năng sử dụng hệ điều hành của bạn để báo cáo bộ nhớ thực như bộ nhớ này.

function unix_get_usage() { 
     $pid = getmypid(); 
     exec("ps -o rss -p $pid", $output); 
     return $output[1] *1024; 
} 

function windows_get_usage(){ 
    $output = array(); 
    exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output); 
    return preg_replace('/[^0-9]/', '', $output[5]) * 1024; 
} 

kịch bản của bạn có thể tiêu thụ nhiều bộ nhớ rằng PHP không cân nhắc khi trở về từ memory_get_usage() (mà nhìn vào đống btw). Các biến được phân bổ stack sẽ bị xóa bởi thời gian memory_get_usage() được gọi và trả về.

Bạn cũng nên thử chạy chức năng này và các chức năng khác tại các điểm khác trong quá trình thực thi, ví dụ: sau khi các cuộc gọi MySQL hoặc xử lý tệp lớn. memory_get_peak_usage() có thể không hoạt động trên tất cả các hệ điều hành, đặc biệt là tùy thuộc vào các tùy chọn biên dịch.

+0

Điều đó có ý nghĩa, nhưng đó không phải là một vấn đề với 'memory_get_peak_usage()'? Tôi sẽ không nghĩ như vậy, nhưng nó sẽ không làm tổn thương để kiểm tra việc sử dụng bộ nhớ một cách khác nhau như bạn đề nghị. – Wiseguy

+0

Không nếu cả hai (memory_get_peak_usage và memory_get_usage) chỉ nhìn vào heap và hầu hết bộ nhớ của bạn là hoàn toàn tự động/stack phân bổ biến. –

+0

Và tôi phải gọi hàm này ở mọi nơi mà tôi sử dụng nhiều bộ nhớ? Có một chức năng hệ thống để có được đỉnh stack? Bởi vì tôi không chắc nơi tập lệnh của tôi sử dụng nhiều bộ nhớ – Marm

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