Ban đầu tôi đã đăng bài này tại /programming/9665189/php-on-command-line-displays-out-of-memory nhưng được khuyên nên đăng ở đây.
Đây không phải là lỗi nghiêm trọng thông thường khi bạn hết bộ nhớ trong tập lệnh, vì nó không cung cấp tên tệp, số dòng hoặc số lượng bộ nhớ được sử dụng. Nó chỉ đơn giản nói "Hết bộ nhớ" bất cứ khi nào tôi cố chạy php trên dòng lệnh, khi bạn chuyển tập lệnh hoặc chỉ đơn giản là chạy php một mình. Ngay cả khi cố gắng chạy một kịch bản không tồn tại cũng cho cùng một thông điệp.
Nói cách khác, tôi nhận được điều này:
dan@server [~]# php
Out of memory
dan@server [~]# php test.php
Out of memory
dan@server [~]# php doesntexist.php
Out of memory
dan@server [~]# php -v
Out of memory
Tuy nhiên PHP thông qua Apache hoạt động hoàn toàn tốt. Chỉ là trên CLI mà tôi gặp lỗi này.
Máy đang được đề cập đang chạy bản phát hành CentOS 5.7 (Bản cuối) là 64 bit và PHP 5.3.10. Nó là một máy chủ chuyên dụng.
Tôi đã thử chạy ulimit -a như dan như đề xuất và đây là đầu ra:
core file size (blocks, -c) 200000
data seg size (kbytes, -d) 200000
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 37888
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) 200000
open files (-n) 100
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 35
virtual memory (kbytes, -v) 200000
file locks (-x) unlimited
free -m trên root cung cấp cho điều này:
total used free shared buffers cached
Mem: 3824 3714 110 0 142 2632
-/+ buffers/cache: 939 2885
Swap: 3490 0 3490
Và việc sử dụng bộ nhớ từ đầu:
Mem: 3916648k total, 3797056k used, 119592k free, 145820k buffers
Swap: 3574452k total, 168k used, 3574284k free, 2686844k cached
CẬP NHẬT: Khởi động lại máy chủ ngày hôm qua và nó hoạt động cho phần còn lại của buổi chiều. Tuy nhiên, ngày nay nó đang làm điều tương tự.
Chạy "strace php test.php" (một tệp tồn tại), nó sẽ tiếp tục trong một thời gian, nhưng trang cuối cùng trong putty là thế này:
fstat(3, {st_mode=S_IFREG|0644, st_size=100030, ...}) = 0
mmap(NULL, 100030, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2ad3ce0af000
close(3) = 0
open("/lib64/libnss_dns.so.2", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\17\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=23736, ...}) = 0
mmap(NULL, 2113792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = -1 ENOMEM (Cannot allocate memory)
close(3) = 0
munmap(0x2ad3ce0af000, 100030) = 0
alarm(0) = 0
futex(0x3d80e07b20, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x3d80e079a0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x3d7fe94760, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x3d7fe94c10, FUTEX_WAKE_PRIVATE, 2147483647) = 0
stat("/etc/krb5.conf", {st_mode=S_IFREG|0644, st_size=608, ...}) = 0
open("/proc/filesystems", O_RDONLY) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 4095) = 314
close(3) = 0
open("/etc/krb5.conf", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY) = 4
read(4, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 4095) = 314
close(4) = 0
access("/etc/krb5.conf", W_OK) = -1 EACCES (Permission denied)
fstat(3, {st_mode=S_IFREG|0644, st_size=608, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ad3ce0af000
read(3, "[logging]\n default = FILE:/var/l"..., 4096) = 608
read(3, "", 4096) = 0
close(3) = 0
munmap(0x2ad3ce0af000, 4096) = 0
open("/dev/urandom", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0444, st_rdev=makedev(1, 9), ...}) = 0
read(3, "\300\260\36co\363cI\t\355\324\3518gy\354\357\314Z:", 20) = 20
close(3) = 0
futex(0x3d7f624640, FUTEX_WAKE_PRIVATE, 2147483647) = 0
open("/proc/filesystems", O_RDONLY) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 4095) = 314
close(3) = 0
open("/etc/krb5.keytab", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/proc/filesystems", O_RDONLY) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 4095) = 314
close(3) = 0
futex(0x3d8122d0c0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
stat("/dev/urandom", {st_mode=S_IFCHR|0444, st_rdev=makedev(1, 9), ...}) = 0
brk(0x340b000) = 0x340b000
brk(0x342c000) = 0x340b000
mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
write(2, "Out of memory\n", 14Out of memory
) = 14
exit_group(1) = ?
EDIT: Đã thêm kết quả đầu ra theo yêu cầu của sonassi.
Toàn bộ nhật ký có sẵn tại http: //www.2 Shared.com/file/05MVRFI6/dmp.html
Đầu ra từ cat / Proc / meminfo:
MemTotal: 3916648 kB
MemFree: 501180 kB
Buffers: 335276 kB
Cached: 2312536 kB
SwapCached: 0 kB
Active: 1312888 kB
Inactive: 1702096 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 3916648 kB
LowFree: 501180 kB
SwapTotal: 3574452 kB
SwapFree: 3574292 kB
Dirty: 728 kB
Writeback: 0 kB
AnonPages: 367160 kB
Mapped: 33640 kB
Slab: 351564 kB
PageTables: 18588 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 5532776 kB
Committed_AS: 1188280 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 265828 kB
VmallocChunk: 34359471827 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
Đầu ra từ cat / Proc / meminfo sau khi chạy php test.php bên dưới. Tôi đã thay thế địa chỉ IP của máy chủ ở đây vì nó là IP công cộng - xxx.xxx.xxx.11 là IP chính của máy chủ và xxx.xxx.xxx.12 là IP khác.
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=3 ID=271 PROTO=UDP SPT=10170 DPT=33437 LEN=12
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=89.39.188.210 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=47199 DF PROTO=TCP SPT=2119 DPT=4899 WINDOW=65535 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=89.39.188.210 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=47678 DF PROTO=TCP SPT=2119 DPT=4899 WINDOW=65535 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=89.39.188.210 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=48675 DF PROTO=TCP SPT=2119 DPT=4899 WINDOW=65535 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=198.60.169.59 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=16299 DF PROTO=TCP SPT=3185 DPT=5555 WINDOW=16384 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=198.60.169.59 DST=xxx.xxx.xxx.12 LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=16300 DF PROTO=TCP SPT=3186 DPT=5555 WINDOW=16384 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=198.60.169.59 DST=xxx.xxx.xxx.12 LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=17038 DF PROTO=TCP SPT=3186 DPT=5555 WINDOW=16384 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=198.60.169.59 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=116 ID=17073 DF PROTO=TCP SPT=3185 DPT=5555 WINDOW=16384 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=188.254.224.225 DST=xxx.xxx.xxx.12 LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=39888 PROTO=TCP SPT=59828 DPT=5900 WINDOW=65535 RES=0x00 SYN URGP=0
Firewall: *TCP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=188.254.224.225 DST=xxx.xxx.xxx.11 LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=43041 PROTO=TCP SPT=59828 DPT=5900 WINDOW=65535 RES=0x00 SYN URGP=0
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=1 ID=269 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=1 ID=269 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=2 ID=270 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=2 ID=270 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=3 ID=271 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=93.191.199.110 DST=xxx.xxx.xxx.11 LEN=32 TOS=0x00 PREC=0x00 TTL=3 ID=271 PROTO=UDP SPT=10202 DPT=33437 LEN=12
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=65.111.170.208 DST=xxx.xxx.xxx.11 LEN=444 TOS=0x00 PREC=0x00 TTL=52 ID=0 DF PROTO=UDP SPT=5105 DPT=5060 LEN=424
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=65.111.170.208 DST=xxx.xxx.xxx.12 LEN=443 TOS=0x00 PREC=0x00 TTL=52 ID=0 DF PROTO=UDP SPT=5105 DPT=5060 LEN=423
TCP: Treason uncloaked! Peer 82.129.64.220:5306/59348 shrinks window 3410313698:3410313754. Repaired.
Firewall: *UDP_IN Blocked* IN=eth0 OUT= MAC=00:23:ae:8f:59:78:30:37:a6:da:d2:e9:08:00 SRC=223.203.192.53 DST=xxx.xxx.xxx.12 LEN=1500 TOS=0x00 PREC=0x00 TTL=47 ID=2742 PROTO=UDP SPT=0 DPT=0 LEN=44665
cat /etc/security/limits.conf cho thấy tất cả được nhận xét theo như tôi có thể nói:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain> <type> <item> <value>
#
#Where:
#<domain> can be:
# - an user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open files
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to
# - rtprio - max realtime priority
#
#<domain> <type> <item> <value>
#
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
# End of file
Và đầu ra của cat /etc/sysctl.conf:
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536
# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
EDIT: Cập nhật ulimit ở trên để chạy như dan, không root.
strace php
meminfo
, limits.conf
, dmesg
và sysctl.conf
tất cả cái nhìn bình thường (rất chuẩn trên thực tế). Vì vậy, tôi sẽ giả sử một vấn đề với chính nhị phân PHP hoặc một phần mở rộng (có thể được biên dịch cho một phiên bản PHP khác). Bạn cũng có thể cung cấp một danh sách các phần mở rộng PHP mà bạn đã cài đặt (ví dụ: APC / Eaccelerator / Xdebug, v.v.).