Lỗi nghiêm trọng: Kích thước bộ nhớ được phép là 134217728 Byte hết (CodeIgniter + XML-RPC)


618

Tôi có một loạt các hệ thống điểm bán hàng (POS) của khách hàng định kỳ gửi dữ liệu bán hàng mới đến một cơ sở dữ liệu tập trung, nơi lưu trữ dữ liệu vào một cơ sở dữ liệu lớn để tạo báo cáo.

POS khách hàng dựa trên PHPPOS và tôi đã triển khai một mô-đun sử dụng thư viện XML-RPC tiêu chuẩn để gửi dữ liệu bán hàng đến dịch vụ. Hệ thống máy chủ được xây dựng trên CodeIgniter và sử dụng các thư viện XML-RPC và XML-RPCS cho thành phần dịch vụ web. Bất cứ khi nào tôi gửi nhiều dữ liệu bán hàng (chỉ có 50 hàng từ bảng bán hàng và các hàng riêng lẻ từ sales_items liên quan đến từng mặt hàng trong bán hàng) tôi gặp phải lỗi sau:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M là giá trị mặc định php.ini, nhưng tôi cho rằng đó là một con số khổng lồ cần phá vỡ. Trên thực tế, tôi thậm chí đã thử đặt giá trị này thành 1024M và tất cả những gì nó làm là mất nhiều thời gian hơn để báo lỗi.

Đối với các bước tôi đã thực hiện, tôi đã thử vô hiệu hóa tất cả quá trình xử lý ở phía máy chủ và đã gian lận để trả về phản hồi đóng hộp bất kể đầu vào là gì. Tuy nhiên, tôi tin rằng vấn đề nằm ở việc gửi dữ liệu thực tế. Tôi thậm chí đã thử vô hiệu hóa thời gian thực thi tập lệnh tối đa cho PHP và nó vẫn bị lỗi.


5
Tôi hơi bối rối ... lỗi xảy ra ở đâu - trong máy khách hoặc máy chủ? Và ở giai đoạn nào ... gửi khách, nhận máy chủ, xử lý máy chủ, gửi máy chủ, nhận máy khách hay xử lý máy khách?
Greg

2
Lỗi dường như xảy ra trong quá trình khách hàng gửi hoặc máy chủ nhận. Tôi đã thử vô hiệu hóa tất cả các xử lý bên máy chủ và gian lận nó để gửi phản hồi đóng hộp bất kể dữ liệu được gửi. Lỗi xảy ra nếu tôi gửi qua một lượng dữ liệu nhất định. Tôi đang thay đổi cài đặt PHP.ini.
Bắc Cực

42
giới hạn bộ nhớ là 128MB, gặp sự cố:ini_set('memory_limit', '256M');

9
Tóm tắt đánh giá thấp tất cả các câu trả lời "chỉ cần bỏ qua rò rỉ", những người nhầm lẫn CodeIgniter với Drupal và những người chỉ sao chép và dán câu trả lời của người khác để nhận điểm. Chất lượng của câu trả lời trong bài này là rất nhiều.
Matti Virkkunen

Câu trả lời:


697

Thay đổi memory_limitbằng ini_set('memory_limit', '-1');không một giải pháp thích hợp. Xin đừng làm vậy.

Mã PHP của bạn có thể bị rò rỉ bộ nhớ ở đâu đó và bạn đang nói với máy chủ chỉ sử dụng tất cả bộ nhớ mà nó muốn. Bạn sẽ không khắc phục vấn đề gì cả. Nếu bạn giám sát máy chủ của mình, bạn sẽ thấy rằng bây giờ có lẽ nó đang sử dụng hầu hết RAM và thậm chí là trao đổi vào đĩa.

Bạn có thể nên cố gắng theo dõi mã vi phạm trong mã của bạn và sửa nó.


174
@Jeff có lẽ bạn đúng 95%. Tuy nhiên, có những lúc bạn thực sự cần nhiều bộ nhớ hơn. Ví dụ: giả sử ứng dụng của bạn đang tải một lượng lớn dữ liệu vào bộ nhớ để xử lý (giả sử Bill of Material có 15k thành phần). Không phải lúc nào mã cũng bị lỗi, đôi khi bạn chỉ cần thêm một chút bộ nhớ (ví dụ 256M thay vì 128M). Tuy nhiên, tôi đồng ý rằng đặt nó thành -1 là rất tệ. Nhưng điều chỉnh giới hạn bộ nhớ cho các tình huống hợp lý trong thời gian chạy là imho hoàn toàn chấp nhận được.
Pyrite

24
@pyrite có bạn nói đúng rằng đôi khi một quá trình đòi hỏi nhiều bộ nhớ hơn nhưng bạn nên tăng giới hạn bộ nhớ lên một số lượng logic như 256MB như bạn đã nói hoặc 512MB tại sao không NHƯNG -1;)
Lukas Lukac

9
@ Jeff Tôi hoàn toàn đồng ý, giá trị -1có thể hữu ích chỉ trong môi trường dev mục đích thử nghiệm.
Esolitos 3/03/2015

4
@Pyrite trong các trường hợp bạn đặt tên cho 5% còn lại đọc dữ liệu theo từng khối và sử dụng một công nhân để xử lý nó thay vì sử dụng nhiều bộ nhớ hơn. Giải pháp này cũng sẽ mở rộng trong khi đề xuất của bạn sẽ không hoạt động ngoại trừ việc bạn tiếp tục nhồi nhiều bộ nhớ hơn vào máy chủ của mình theo thời gian nếu dữ liệu phát triển.
burzum

2
Theo cách phổ biến nhất, sự cố này xảy ra trong ORM khi bạn cố gắng tìm nạp dữ liệu giới hạn bộ nhớ php nhiều hơn. Ví dụ khi bạn cố gắng tạo báo cáo hàng tháng.
Stepchik

213

ini_set('memory_limit', '-1');ghi đè giới hạn bộ nhớ PHP mặc định .


16
@williamcarswell; -1là một giá trị mà PHP hiểu là không giới hạn trong bối cảnh này.
Alix Axel

7
@ ArseniuszŁozicki - nó cũng sẽ tiêu tốn tài nguyên mà máy chủ không thể dự phòng.
Ken Williams

124
Thật xấu hổ vì điều này nhận được rất nhiều upvote. Đặt nó thành một giá trị chính xác, với các chỉnh sửa php.ini hoặc ini_set, là một giải pháp hoàn toàn hợp lệ khi mọi người cần thêm bộ nhớ. Đặt nó thành không giới hạn là một hack nguy hiểm :(
Jeff Davis

24
@ user1767586 sau đó đặt nó thành một giá trị lành mạnh. Bạn có thể ngăn tập lệnh ném lỗi bằng cách đặt nó thành 1024M. Nếu câu trả lời này nói ini_set ('memory_limit', '1024M'); Bạn có thể sao chép-dán nó và được. Bằng cách đặt nó thành -1, bạn đang tự thiết lập để có một tập lệnh tiêu thụ hết bộ nhớ. Đặc biệt là nếu bạn làm điều này thường xuyên. Đặt "nguy hiểm" trong dấu ngoặc kép sẽ không làm cho nó bớt nguy hiểm. Bạn thực sự có thể vòi máy chủ của bạn. Có thể bắt đầu hủy dữ liệu. Tôi không biết, có thể mất việc? Nghe có vẻ khá nguy hiểm với tôi. : |
Jeff Davis

3
Thật buồn khi thấy câu trả lời cho +161 phiếu và -3 phiếu giống nhau :(
akarthik10

130

Cách chính xác là chỉnh sửa php.initập tin của bạn . Chỉnh sửa memory_limitgiá trị mong muốn của bạn.

Từ câu hỏi của bạn, 128M(đó là giới hạn mặc định) đã bị vượt quá, do đó, có một lỗi nghiêm trọng với mã của bạn vì nó không nên mất nhiều như vậy.

Nếu bạn biết tại sao phải mất nhiều như vậy và bạn muốn cho phép nó được đặt memory_limit = 512Mhoặc cao hơn và bạn nên làm tốt.


7
Thành thật mà nói, nếu bộ nhớ đệm của bạn một số lượng dữ liệu nghiêm trọng, đây là câu trả lời chính xác. 128M là không đủ cho các tập lệnh nhất định. 512M hoặc 1024M thường sẽ là đủ, nhưng bạn phải quyết định từng trường hợp.
Jeff Davis

2
Tuy nhiên, Yeha cố gắng tránh sử dụng bộ nhớ lớn, nếu số lượng người dùng sẽ nhiều hơn
Basav

2
bộ nhớ_limit = -1; được đặt trong php.ini

2
@YumYumYum Điều đó loại bỏ memory_limit, điều bạn chỉ muốn nếu bạn theo dõi việc sử dụng bộ nhớ theo một cách khác. HĐH sẽ giết quá trình nếu nó chiếm một lượng lớn bộ nhớ tại một số điểm.
Flimm

Vì vậy, nếu bạn đang chạy tập lệnh sử dụng nhiều bộ nhớ, nhưng bạn chỉ cần chạy tập lệnh một lần, bạn có thể tăng giới hạn bộ nhớ cho quy trình tại thời điểm thực hiện không, sau đó giảm lại giới hạn bộ nhớ sau một lần kịch bản chạy?
chromechris

95

Việc cấp phát bộ nhớ cho PHP có thể được điều chỉnh vĩnh viễn hoặc tạm thời.

Vĩnh viễn

Bạn có thể thay đổi vĩnh viễn việc cấp phát bộ nhớ PHP theo hai cách.

Nếu bạn có quyền truy cập vào php.initệp của mình , bạn có thể chỉnh sửa giá trị cho memory_limitgiá trị mong muốn của mình.

Nếu bạn không có quyền truy cập vào php.initệp của mình (và webhost của bạn cho phép), bạn có thể ghi đè phân bổ bộ nhớ thông qua .htaccesstệp của mình . Thêm php_value memory_limit 128M(hoặc bất cứ điều gì phân bổ mong muốn của bạn là).

Tạm thời

Bạn có thể điều chỉnh phân bổ bộ nhớ một cách nhanh chóng từ trong tệp PHP. Bạn chỉ cần có mã ini_set('memory_limit', '128M');(hoặc bất kỳ phân bổ mong muốn của bạn là gì). Bạn có thể xóa giới hạn bộ nhớ (mặc dù giới hạn máy hoặc thể hiện vẫn có thể áp dụng) bằng cách đặt giá trị thành "-1".


2
Cảm ơn bạn Tôi đã không nghĩ kiểm tra xem ai đó đã đặt giá trị trong .htaccess đang ghi đè php.ini và tôi không thể hiểu tại sao +1
HostMyBus

61

Rất dễ bị rò rỉ bộ nhớ trong tập lệnh PHP - đặc biệt nếu bạn sử dụng tính trừu tượng, chẳng hạn như ORM. Hãy thử sử dụng Xdebug để cấu hình tập lệnh của bạn và tìm xem tất cả bộ nhớ đó đã đi đâu.


1
Tôi sẽ đi thử Xdebug. Tôi chưa bao giờ sử dụng nó trước đây, vì vậy tôi sẽ phải đọc nó. Cảm ơn vì nhắn lại! Hy vọng tôi sẽ sớm tìm thấy câu trả lời cho điều này ...
ArcticZero

34
Hãy nhớ rằng PHP sử dụng tính tham chiếu để quản lý bộ nhớ. Vì vậy, nếu bạn có các tham chiếu vòng tròn hoặc các biến toàn cục, các đối tượng đó sẽ không được tái chế. Đó thường là gốc của rò rỉ bộ nhớ trong PHP.
troelskn

Xdebug cho thấy rằng thư viện Xmlrpc.php của CI chịu trách nhiệm cho việc rò rỉ bộ nhớ của tôi. Trong mọi trường hợp, liệu có bất kỳ vấn đề nào với các thư viện XML-RPC của CodeIgniter mà tôi nên biết không? Tôi đã thử vô hiệu hóa tất cả phía máy chủ xử lý và nó vẫn hết bộ nhớ nếu tôi cung cấp đủ dữ liệu.
Bắc Cực

1
Tôi không biết / sử dụng CI, vì vậy tôi không biết. Nhưng có lẽ bạn nên cố gắng tìm một đối tượng không được giải phóng sau khi sử dụng - rất có thể là do tham chiếu theo chu kỳ. Đó là công việc thám tử.
troelskn

1
Đây là câu trả lời duy nhất ở đây khuyên rằng thực sự giải quyết vấn đề. Các câu trả lời khác làm tăng trí nhớ để băng bó một triệu chứng và bỏ qua bệnh .
Chris Baker

56

Khi thêm 22,5 triệu bản ghi vào một mảng với mảng_push, tôi liên tục nhận được các lỗi nghiêm trọng "hết bộ nhớ" ở khoảng 20 triệu bản ghi sử dụng 4Glàm giới hạn bộ nhớ trong tệp php.ini. Để khắc phục điều này, tôi đã thêm tuyên bố

$old = ini_set('memory_limit', '8192M');

ở đầu tập tin Bây giờ mọi thứ đang hoạt động tốt. Tôi không biết nếu PHP bị rò rỉ bộ nhớ. Đó không phải là công việc của tôi, tôi cũng không quan tâm. Tôi chỉ cần hoàn thành công việc của mình, và điều này đã làm việc.

Chương trình rất đơn giản:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

Lỗi nghiêm trọng chỉ đến dòng 3 cho đến khi tôi tăng giới hạn bộ nhớ, loại bỏ lỗi này.


10
ý bạn là ini_set('memory_limit', '8192M');sao
Gogol

2
Thật là một sự xa xỉ sẽ có thời gian để đi và tối ưu hóa một kịch bản cho một cái gì đó như thế. Hoặc nghiên cứu và so sánh và tìm hiểu các công cụ ETL hoặc một số như vậy. Trong thế giới thực, chúng ta kích hoạt trợ cấp bộ nhớ lên, làm điều đó và tiếp tục.
Matthew Poer

45

Tôi liên tục nhận được lỗi này, ngay cả khi memory_limitđã đặt php.inivà giá trị đọc chính xác bằng phpinfo().

Bằng cách thay đổi nó từ đây:

memory_limit=4G

Về điều này:

memory_limit=4096M

Điều này đã khắc phục vấn đề trong PHP 7.


23

Khi bạn thấy lỗi trên - đặc biệt nếu (tried to allocate __ bytes)giá trị thấp, đó có thể là một chỉ báo của một vòng lặp vô hạn, giống như một hàm tự gọi mà không có lối thoát:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

19

Sau khi kích hoạt hai dòng này, nó bắt đầu hoạt động:

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120


19

Bạn có thể sửa lỗi này bằng cách thay đổi memory_limittrên fastcgi / fpm:

$vim /etc/php5/fpm/php.ini

Thay đổi bộ nhớ, như từ 128 thành 512, xem bên dưới

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

đến

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M

18

Thư mục gốc của trang web của bạn:

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

1
Điều này làm việc cho tôi. yêu một giải pháp. +1 cho đơn giản
Steve C

14

Thay đổi giới hạn bộ nhớ trong tệp php.ini và khởi động lại Apache. Sau khi khởi động lại, hãy chạy phpinfo (); chức năng từ bất kỳ tệp PHP để memory_limitxác nhận thay đổi.

memory_limit = -1

Giới hạn bộ nhớ -1 có nghĩa là không có giới hạn bộ nhớ được đặt. Bây giờ là tối đa.


13

Đối với người dùng Drupal, câu trả lời này của Chris Lane về:

ini_set('memory_limit', '-1');

hoạt động nhưng chúng ta cần đặt nó ngay sau khi mở

<?php

thẻ trong tệp index.php trong thư mục gốc của trang web của bạn.


13

Trong Drupal 7, bạn có thể sửa đổi giới hạn bộ nhớ trong tệp settings.php nằm trong thư mục trang web / mặc định của bạn. Khoảng dòng 260, bạn sẽ thấy điều này:

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

Ngay cả khi cài đặt php.ini của bạn đủ cao, bạn sẽ không thể tiêu thụ nhiều hơn 128 MB nếu điều này không được đặt trong tệp Drupal settings.php.


1
Không có trong Drupal7, không có chuỗi mã nào như vậy trong settings.php
FLY

Cũng không có chuỗi nào trong settings.php cho drupal 6
AllisonC

12

Thay vì thay đổi memory_limitgiá trị trong php.initệp của bạn , nếu có một phần mã của bạn có thể sử dụng nhiều bộ nhớ, bạn có thể xóa phần memory_limittrước khi phần đó chạy, sau đó thay thế nó sau.

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);

7

PHP 5.3+ cho phép bạn thay đổi giới hạn bộ nhớ bằng cách đặt một .user.initệp trong public_htmlthư mục. Chỉ cần tạo tệp trên và nhập dòng sau vào đó:

memory_limit = 64M

Một số máy chủ cPanel chỉ chấp nhận phương pháp này.


7

Trang bị sập?

Nhập mô tả hình ảnh ở đây

(Điều này xảy ra khi MySQL phải truy vấn các hàng lớn. Theo mặc định, memory_limitđược đặt thành nhỏ, an toàn hơn cho phần cứng.)

Bạn có thể kiểm tra trạng thái bộ nhớ hiện có của hệ thống, trước khi tăng php.ini:

# free -m
             total       used       free     shared    buffers     cached
Mem:         64457      63791        666          0       1118      18273
-/+ buffers/cache:      44398      20058
Swap:         1021          0       1021

Ở đây tôi đã tăng nó như sau và sau đó làm service httpd restartđể khắc phục sự cố trang sự cố.

# grep memory_limit /etc/php.ini
memory_limit = 512M

Số nào (hàng và cột?) Người ta nên xem sau khi chạy free -mlệnh để quyết định bộ nhớ mới_limit?
kiradotee

7

Chỉ cần thêm một ini_set('memory_limit', '-1');dòng ở đầu trang web của bạn.

Và bạn có thể đặt bộ nhớ theo nhu cầu của mình ở vị trí -1, đến 16M, v.v.


6
Điều này dường như nói điều tương tự như nhiều câu trả lời hiện có. Tốt nhất là chỉ thêm một câu trả lời cho một câu hỏi phổ biến chỉ khi tài liệu mới cung cấp một cái gì đó mới lạ.
giảm bớt

6

Đối với những người đang gãi đầu để tìm hiểu lý do tại sao trên trái đất, chức năng nhỏ này sẽ gây ra rò rỉ bộ nhớ, đôi khi do một chút sai lầm, một chức năng bắt đầu gọi chính nó mãi mãi.

Ví dụ, một lớp proxy có cùng tên cho một chức năng của đối tượng sẽ ủy quyền nó.

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}

Đôi khi bạn có thể quên mang theo thành viên thực tế nhỏ bé đó và vì proxy thực sự có doSomethingphương thức đó , PHP sẽ không gây ra lỗi nào cho bạn và đối với một lớp lớn, nó có thể bị ẩn khỏi mắt trong vài phút để tìm hiểu lý do tại sao đang rò rỉ bộ nhớ.


Và một mẹo khác: bạn có thể nhập die('here')mã của mình và di chuyển câu lệnh đó để xem nơi đệ quy bắt đầu.
chập chững

6

Tôi đã có lỗi bên dưới trong khi chạy trên một tập dữ liệu nhỏ hơn so với trước đây.

Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép hết 134217728 byte (đã cố phân bổ 4096 byte) trong C: \ workspace \ image_man Quản lý trên dòng 173

Khi tìm kiếm lỗi đã đưa tôi đến đây, tôi nghĩ rằng tôi không phải lúc nào cũng đề cập đến các giải pháp kỹ thuật trong các câu trả lời trước, mà là một thứ đơn giản hơn. Trong trường hợp của tôi, đó là Firefox. Trước khi tôi chạy chương trình, nó đã sử dụng 1.157 MB.

Hóa ra tôi đã xem một video 50 phút một chút trong một khoảng thời gian nhiều ngày và điều đó đã làm mọi thứ rối tung lên. Đó là cách khắc phục mà các chuyên gia sửa chữa mà không cần suy nghĩ về nó, nhưng đối với những người như tôi thì đáng để lưu tâm.


Tôi đã có một sự xuất hiện tương tự trên Google Chrome ngày hôm nay. Tôi đã vô cùng hoài nghi về câu trả lời này ... tuy nhiên, nó đã tiết lộ rằng sự cạn kiệt byte của tôi biến mất sau khi tôi mở một cửa sổ ẩn danh và lại quay lại cùng một kịch bản! Các nghiên cứu tiếp tục.
mickmackusa

2

Chạy tập lệnh như thế này (ví dụ trường hợp cron): php5 /pathToScript/info.phptạo ra lỗi tương tự.

Cách chính xác: php5 -cli /pathToScript/info.php


2

Nếu bạn đang chạy VPS được hỗ trợ WHM (máy chủ riêng ảo), bạn có thể thấy rằng mình không có quyền chỉnh sửa trực tiếp PHP.INI; hệ thống phải làm điều đó. Trong bảng điều khiển máy chủ WHM, đi đến Cấu hình dịch vụTrình chỉnh sửa cấu hình PHP và sửa đổi memory_limit:

Cập nhật memory_limit trên WHM 11.48.4


2

Tôi thấy nó hữu ích khi bao gồm hoặc yêu cầu _dbconnection.php__functions.phptrong các tệp thực sự được xử lý, thay vì bao gồm trong tiêu đề. Mà được bao gồm trong chính nó.

Vì vậy, nếu bao gồm tiêu đềchân trang của bạn , chỉ cần bao gồm tất cả các tệp chức năng của bạn trước khi tiêu đề được bao gồm.


2

Sử dụng yieldcó thể là một giải pháp là tốt. Xem cú pháp Trình tạo .

Thay vì thay đổi PHP.initệp để lưu trữ bộ nhớ lớn hơn, đôi khi thực hiện yieldbên trong một vòng lặp có thể khắc phục sự cố. Những gì mang lại là thay vì bỏ tất cả dữ liệu cùng một lúc, nó đọc từng cái một, tiết kiệm rất nhiều bộ nhớ sử dụng.


2
PHP.ini? Phải không php.ini?
Peter Mortensen

1

Lỗi này đôi khi được gây ra bởi một lỗi trong mã PHP gây ra sự thu hồi liên quan đến xử lý ngoại lệ và có thể các hoạt động khác. Thật không may, tôi đã không thể tạo ra một ví dụ nhỏ.

Trong những trường hợp này, điều này đã xảy ra với tôi nhiều lần, set_time_limitkhông thành công và trình duyệt tiếp tục tải đầu ra PHP, với một vòng lặp vô hạn hoặc với thông báo lỗi nghiêm trọng là chủ đề của câu hỏi này.

Bằng cách giảm kích thước phân bổ được phép bằng cách thêm

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

gần đầu mã của bạn, bạn sẽ có thể ngăn ngừa lỗi nghiêm trọng.

Sau đó, bạn có thể bị bỏ lại với một chương trình chấm dứt, nhưng vẫn khó gỡ lỗi.

Tại thời điểm này, chèn BreakLoop()các cuộc gọi bên trong chương trình của bạn để giành quyền kiểm soát và tìm ra vòng lặp hoặc đệ quy nào trong chương trình của bạn đang gây ra sự cố.

Định nghĩa của BreakLoop như sau:

function BreakLoop($MaxRepetitions=500,$LoopSite="unspecified")
    {
    static $Sites=[];
    if (!@$Sites[$LoopSite] || !$MaxRepetitions)
        $Sites[$LoopSite]=['n'=>0, 'if'=>0];
    if (!$MaxRepetitions)
        return;
    if (++$Sites[$LoopSite]['n'] >= $MaxRepetitions)
        {
        $S=debug_backtrace(); // array_reverse
        $info=$S[0];
        $File=$info['file'];
        $Line=$info['line'];
        exit("*** Loop for site $LoopSite was interrupted after $MaxRepetitions repetitions. In file $File at line $Line.");
        }
    } // BreakLoop

Đối số $ LoopSite có thể là tên của một hàm trong mã của bạn. Điều đó thực sự không cần thiết, vì thông báo lỗi bạn sẽ nhận được sẽ chỉ cho bạn đến dòng chứa cuộc gọi BreakLoop ().


-1

Trong trường hợp của tôi, đó là một vấn đề ngắn gọn với cách viết một hàm. Rò rỉ bộ nhớ có thể được gây ra bằng cách gán một giá trị mới cho biến đầu vào của hàm, ví dụ:

/**
* Memory leak function that illustrates unintentional bad code
* @param $variable - input function that will be assigned a new value
* @return null
**/
function doSomehting($variable){
    $variable = 'set value';
    // Or
    $variable .= 'set value';
}

-6

Khi tôi xóa các dòng sau khỏi mã của mình, tất cả đều hoạt động tốt!

set_include_path(get_include_path() . get_include_path() . '/phpseclib');
include_once('Net/SSH2.php');
include_once('Net/SFTP.php');

Những dòng này được bao gồm trong mọi tập tin tôi đang chạy. Khi chạy từng tệp một, tất cả đều hoạt động tốt, nhưng khi chạy tất cả các tệp cùng nhau, tôi gặp vấn đề rò rỉ bộ nhớ. Bằng cách nào đó, "include_once" không bao gồm những thứ một lần hoặc tôi đang làm gì đó sai ...


set_include_path(get_include_path() . get_include_path().'/phpseclib'); Điều này sẽ thêm đường dẫn '/ phpseclib' một lần cho mỗi tệp có dòng ... để nó có thể thêm nó nhiều lần! Tôi khuyên bạn nên đặt nó trong một tệp cài đặt và include_oncetệp cài đặt.
Farfromunique
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.