Giới hạn bộ nhớ php cli


35

Tôi đang gặp lỗi bộ nhớ trong công việc cron php:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 71 bytes) in /opt/matrix/core/lib/DAL/DAL.inc on line 830

Các phần áp dụng của crontab là:

$ sudo crontab -u www-data -l
MAILTO=root
# m h  dom mon dow   command
*/15 * * * * php /opt/matrix/core/cron/run.php /opt/matrix

Tôi đang chạy trên Debian Squeeze, được cập nhật đầy đủ.

Giải pháp rõ ràng là cli có giới hạn bộ nhớ thấp (64MB). Tuy nhiên, /etc/php5/cli/php.ini nói rằng nó không giới hạn.

$ cat /etc/php5/cli/php.ini | grep memory_limit
memory_limit = -1

Tôi đã đọc ở đâu đó rằng nó có thể khác nhau đối với những người dùng khác nhau và vì quá trình này đang chạy dưới dạng dữ liệu www, tôi đã chạy:

$ sudo -u www-data -s
$ php -i | grep memory_limit
memory_limit => -1 => -1
suhosin.memory_limit => 0 => 0

Ngay cả apache / php.ini cũng có giới hạn cao hơn lỗi yêu cầu:

$ sudo cat /etc/php5/apache2/php.ini | grep memory_limit
memory_limit = 128M

Tôi đang thiếu gì? Giới hạn bộ nhớ này ở đâu?

Câu trả lời:


61

IIRC, bộ nhớ_limit không giới hạn không được CLI hỗ trợ (Tôi sẽ cố gắng tìm nguồn cho việc này) nhưng bây giờ, hãy thử chuyển nó vào lệnh:

php -d memory_limit=128M my_script.php

CẬP NHẬT

Rõ ràng tôi đã mơ về bộ nhớ không giới hạn_limit không được hỗ trợ cho php cli. Bất kể, có vẻ như giá trị từ ini bị bỏ qua. Giải pháp đơn giản nhất sau đó là đặt nó cụ thể trong lệnh php gọi tập lệnh.

CẬP NHẬT2

Để trả lời câu hỏi giới hạn bộ nhớ đến từ đâu, rất có thể nó được đặt trong chính tập lệnh bằng cách sử dụng 'ini_set'.


Conf đó là cấu hình mặc định của debian, không có gì đặc biệt từ tôi. Thật kỳ lạ, bình luận ở trên nói rằng nó làm cho bộ nhớ giới hạn 128 MB.
Ryan H

Hrm, câu hỏi WHERE giá trị đến từ đâu (đó là câu hỏi thực tế rõ ràng / không đọc hiểu) bạn có bất kỳ ini_set memory_limit nào trong mã không?
DTest

chạy php --ini để in danh sách các tệp cấu hình mà nó đang đọc. Trong cấu hình FreeBSD, nó sẽ tìm các tệp trong /usr/local/etc/php/*.ini sau khi đọc /usr/local/etc/php.ini chính
Allan Jude

có vẻ như tập lệnh đang đặt bộ nhớ trong thành giá trị này. Cảm ơn đã giúp tôi loại trừ mọi thứ khác. Tôi thực sự không muốn nó là thế! Cảm ơn các mẹo -d.
Ryan H

1
Kịch bản đặt giới hạn bộ nhớ riêng bên trong ứng dụng. Nó được đặt thành 64 MB. Cảm ơn đã giúp tôi tìm thấy nó.
Ryan H

0

Trong khi thử nghiệm phiên bản php CLI, 5.5.9có vẻ như trong cli, nó đã bị giới hạn bộ nhớ theo mặc định và việc chỉ định php -d memory_limit=4G my_script.phpsẽ đặt giới hạn cho điều đó.


Điều đó không chính xác, CLI sẽ chỉ tuân theo cài đặt memory_limit được chỉ định trong tệp php.ini
Tim

-3

Nếu bạn cài đặt PHP dưới dạng mô-đun Apache (kiểm tra 'API máy chủ' phpinfo()), bạn nên gọi nó thông qua trình duyệt web dòng lệnh (wget, curl, lynx, ...) trong công việc định kỳ, đại loại như thế này:

*/15 * * * * lynx -dump http://localhost/script.php >> /var/log/script.log 2>&1

Điều đó chỉ làm lãng phí thêm bộ nhớ trên Apache. Cả SAPI và CLI đều được cài đặt, vì vậy tốt nhất là sử dụng CLI trong trường hợp này.
Allan Jude
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.