Cấu hình cho memory_limit
của PHP đang chạy dưới dạng mô-đun Apache cho trang web của máy chủ phải xem xét số lượng quá trình Apache bạn có thể có cùng lúc trên máy - xem tùy chọn cấu hình MaxClients
cho Apache.
Nếu MaxClients
là 100 và bạn có 2.000 MB hoặc RAM, tính toán rất nhanh sẽ cho thấy bạn không nên sử dụng nhiều hơn 20 MB * (vì 20 MB * 100 khách hàng = 2 GB hoặc RAM, tức là tổng số tiền bộ nhớ máy chủ của bạn có) * cho giá trị memory_limit. Và đây không phải là xem xét rằng có lẽ những thứ khác đang chạy trên cùng một máy chủ, như MySQL, bản thân hệ thống, ... Và rằng Apache có lẽ đã sử dụng một số bộ nhớ cho chính nó.
Hoặc tất nhiên, đây cũng là "trường hợp xấu nhất", xem xét rằng mỗi trang PHP đang sử dụng số lượng bộ nhớ tối đa có thể.
Trong trường hợp của bạn, nếu bạn cần một lượng bộ nhớ lớn chỉ cho một công việc, tôi sẽ không tăng memory_limit
cho PḦP chạy dưới dạng mô-đun Apache.
Thay vào đó, tôi sẽ khởi chạy công việc đó từ dòng lệnh (hoặc qua công việc cron) và chỉ định một đặc tính memory_limit
cao hơn trong trường hợp một và duy nhất này.
này có thể được thực hiện với sự -d
tùy chọn php, như:
$ php -d memory_limit=1GB temp.php
string(3) "1GB"
Xét, trong trường hợp này, temp.php rằng chỉ có chứa:
var_dump(ini_get('memory_limit'));
Theo tôi, đây là cách an toàn hơn là tăng memory_limit cho mô-đun PHP cho Apache - và đó là những gì tôi thường làm khi tôi có một tập dữ liệu lớn, hoặc một số công cụ thực sự nặng mà tôi không thể tối ưu hóa hoặc phân trang.
Nếu bạn cần xác định một số giá trị cho việc thực hiện CLI PHP, bạn cũng có thể yêu cầu nó sử dụng tệp cấu hình khác thay vì php mặc định.ini, với -c
tùy chọn:
php -c /etc/phpcli.ini temp.php
Bằng cách đó, bạn có:
/etc/php.ini
cho Apache, với thấp memory_limit
, thấp max_execution_time
...
- và
/etc/phpcli.ini
cho lô chạy từ lệnh - với hầu như không có giới hạn
Điều này đảm bảo các lô của bạn sẽ có thể chạy - và bạn sẽ vẫn có bảo mật cho trang web của bạn (memory_limit
và max_execution_time
là biện pháp an ninh)
Tuy nhiên, nếu bạn có thời gian để tối ưu hóa kịch bản của bạn, bạn nên; ví dụ, trong tình huống đó, bạn phải đối mặt với rất nhiều dữ liệu, việc phân trang là phải có ;-)
Thành thật mà nói, bạn không nên quan tâm đến việc đặt giới hạn bộ nhớ, nhưng với việc tìm ra nơi rò rỉ bộ nhớ của bạn và sửa nó. Nó không phải là một giải pháp để chỉ tăng memory_limit, nó là tránh một vấn đề trong mã. Nhìn vào các đối tượng bạn đang thiết lập và bỏ các giá trị để xóa một rò rỉ. – Petrogad
Bạn có thể cụ thể về lượng dữ liệu không? Bạn có ý nghĩa gì lớn? – jergason
@Frederico: OP không cố gắng sửa lỗi rò rỉ bộ nhớ, anh ấy yêu cầu giải pháp xử lý các tập dữ liệu rất lớn trong PHP. – arul