Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Tôi nhận ra cái thứ hai tránh được chi phí của một cuộc gọi chức năng (cập nhật, thực sự là một cấu trúc ngôn ngữ), nhưng sẽ rất thú vị khi biết liệu cái này có tốt hơn cái kia không. Tôi đã sử dụng

Notice: Undefined variable: a in xxx
NULL
9 cho hầu hết các mã hóa của mình, nhưng gần đây tôi đã xem qua một vài lớp đáng kính được tìm thấy ngoài mạng sử dụng
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
0 thay thế.update, is actually a language construct), but it would be interesting to know if one is better than the other. I have been using
Notice: Undefined variable: a in xxx
NULL
9 for most of my coding, but I've recently looked through a few respectable classes found off the net that use
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
0 instead.

Có một cái ưa thích, và lý do là gì?

hỏi ngày 25 tháng 2 năm 2009 lúc 6:33Feb 25, 2009 at 6:33

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Alexalexalex

469K197 Huy hiệu vàng868 Huy hiệu bạc977 Huy hiệu Đồng197 gold badges868 silver badges977 bronze badges

Nó đã được đề cập trong trang Hướng dẫn không được đặt vào năm 2009:

Notice: Undefined variable: a in xxx
NULL
9 thực hiện đúng những gì tên của nó nói - không đặt một biến. Nó không buộc giải phóng bộ nhớ ngay lập tức. Người thu gom rác của PHP sẽ làm điều đó khi thấy phù hợp - theo ý định sớm, vì những chu kỳ CPU đó không cần thiết, hoặc muộn như trước khi tập lệnh sẽ hết bộ nhớ, bất cứ điều gì xảy ra trước.

Nếu bạn đang thực hiện

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
2 thì bạn đang viết lại dữ liệu của biến. Bạn có thể nhận được bộ nhớ được giải phóng / thu nhỏ nhanh hơn, nhưng nó có thể đánh cắp các chu kỳ CPU từ mã thực sự cần chúng sớm hơn, dẫn đến thời gian thực hiện tổng thể dài hơn.

(Kể từ năm 2013, trang người đàn ông

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 đó không bao gồm phần đó nữa)

Lưu ý rằng cho đến khi PHP5.3, nếu bạn có hai đối tượng trong tài liệu tham khảo tròn, chẳng hạn như trong mối quan hệ cha con, việc gọi unset () trên đối tượng cha sẽ không giải phóng bộ nhớ được sử dụng cho tham chiếu cha mẹ trong đối tượng con. (Cũng sẽ không được giải phóng bộ nhớ khi đối tượng cha được thu thập rác.)


Câu hỏi "Sự khác biệt giữa Unset và = Null" nêu chi tiết một số khác biệt:


$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
4 cũng loại bỏ
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
5 khỏi bảng ký hiệu; Ví dụ:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

Outputs:

Notice: Undefined variable: a in xxx
NULL

Nhưng khi

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
6 được sử dụng:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

Outputs:

NULL

Có vẻ như

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
6 nhanh hơn một chút so với đối tác
Notice: Undefined variable: a in xxx
NULL
9 của nó: Cập nhật mục nhập bảng ký hiệu dường như nhanh hơn so với việc loại bỏ nó.


  • Khi bạn cố gắng sử dụng biến không tồn tại (
    $a = str_repeat('hello world ', 100);
    $a = null;
    var_dump($a);
    
    3), một lỗi sẽ được kích hoạt và giá trị cho biểu thức biến sẽ là null. (Bởi vì, PHP nên làm gì khác? Mọi biểu thức cần dẫn đến một số giá trị.)
  • Một biến với null được gán cho nó vẫn là một biến hoàn toàn bình thường.

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Al Fohnce

4.06512 Huy hiệu vàng37 Huy hiệu bạc48 Huy hiệu đồng12 gold badges37 silver badges48 bronze badges

Đã trả lời ngày 25 tháng 2 năm 2009 lúc 6:50Feb 25, 2009 at 6:50

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

VoncvoncVonC

1.2M496 Huy hiệu vàng4174 Huy hiệu bạc4927 Huy hiệu đồng496 gold badges4174 silver badges4927 bronze badges

13

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 không thực sự là một hàm, mà là một cấu trúc ngôn ngữ. Nó không phải là một cuộc gọi hàm hơn
NULL
1 hoặc
NULL
2.language construct. It is no more a function call than a
NULL
1 or an
NULL
2.

Ngoài các vấn đề về hiệu suất, sử dụng

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 làm cho ý định của bạn rõ ràng hơn nhiều.

Đã trả lời ngày 25 tháng 2 năm 2009 lúc 8:55Feb 25, 2009 at 8:55

Alex Barrettalex BarrettAlex Barrett

15.7K3 Huy hiệu vàng 50 Huy hiệu bạc51 Huy hiệu Đồng3 gold badges50 silver badges51 bronze badges

7

Bằng cách thực hiện unset () trên một biến, về cơ bản bạn đã đánh dấu biến cho 'bộ sưu tập rác' (PHP không thực sự có một, nhưng ví dụ như lợi ích) vì vậy bộ nhớ không có sẵn ngay lập tức. Biến không còn chứa dữ liệu, nhưng ngăn xếp vẫn ở kích thước lớn hơn. Thực hiện phương thức NULL làm giảm dữ liệu và thu nhỏ bộ nhớ ngăn xếp gần như ngay lập tức.

Điều này đã được từ kinh nghiệm cá nhân và những người khác là tốt. Xem các ý kiến ​​của hàm Untet () ở đây.

Cá nhân tôi sử dụng unset () giữa các lần lặp trong một vòng lặp để tôi không phải có độ trễ của ngăn xếp có kích thước yo-yo. Dữ liệu đã biến mất, nhưng dấu chân vẫn còn. Ở lần lặp tiếp theo, bộ nhớ đã được PHP và do đó, nhanh hơn để khởi tạo biến tiếp theo.

Đã trả lời ngày 25 tháng 2 năm 2009 lúc 6:45Feb 25, 2009 at 6:45

William Holroydwilliam HolroydWilliam Holroyd

3,3441 Huy hiệu vàng20 Huy hiệu bạc25 Huy hiệu Đồng1 gold badge20 silver badges25 bronze badges

3


Theo đó, có vẻ như "= null" nhanh hơn.

Kết quả Php 5.4:

  • mất 0,88389301300049 giây
  • mất 2.1757180690765 giây

Kết quả Php 5.3:

  • mất 1.7235369682312 giây
  • mất 2.9490959644318 giây

Kết quả Php 5.2:

  • mất 3.0069220066071 giây
  • mất 4.7002630233765 giây

Kết quả Php 5.1:

  • mất 2.6272349357605 giây
  • mất 5.0403649806976 giây

Mọi thứ bắt đầu khác với Php 5.0 và 4.4.

5.0:

  • mất 10.038941144943 giây
  • mất 7.087440967598 giây

4.4:

  • mất 7.5352551937103 giây
  • mất 6.6245851516724 giây

Hãy nhớ rằng microtime (true) không hoạt động trong PHP 4.4 vì vậy tôi phải sử dụng ví dụ microtime_float được đưa ra trong php.net/microtime / ví dụ #1.

Đã trả lời ngày 26 tháng 11 năm 2012 lúc 4:12Nov 26, 2012 at 4:12

5

Nó hoạt động theo một cách khác cho các biến được sao chép bằng tham chiếu:

$a = 5;
$b = &$a;
unset($b); // just say $b should not point to any variable
print $a; // 5

$a = 5;
$b = &$a;
$b = null; // rewrites value of $b (and $a)
print $a; // nothing, because $a = null

Antti29

2.91512 Huy hiệu vàng36 Huy hiệu bạc36 Huy hiệu đồng12 gold badges36 silver badges36 bronze badges

Đã trả lời ngày 2 tháng 8 năm 2012 lúc 2:32Aug 2, 2012 at 2:32

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

RIADRIADRiaD

46K10 Huy hiệu vàng75 Huy hiệu bạc120 Huy hiệu đồng10 gold badges75 silver badges120 bronze badges

2

Nó làm cho một sự khác biệt với các yếu tố mảng.

Xem xét ví dụ này

$a = array('test' => 1);
$a['test'] = NULL;
echo "Key test ", array_key_exists('test', $a)? "exists": "does not exist";

Ở đây, khóa 'kiểm tra' chính vẫn tồn tại. Tuy nhiên, trong ví dụ này

$a = array('test' => 1);
unset($a['test']);
echo "Key test ", array_key_exists('test', $a)? "exists": "does not exist";

Chìa khóa không còn tồn tại.

Đã trả lời ngày 26 tháng 3 năm 2011 lúc 11:03Mar 26, 2011 at 11:03

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Aurisaurisauris

6916 Huy hiệu bạc5 Huy hiệu Đồng6 silver badges5 bronze badges

Về các đối tượng, đặc biệt là trong kịch bản tải xuống, người ta nên xem xét bộ thu gom rác đang chạy trong các chu kỳ CPU nhàn rỗi, vì vậy giả định rằng bạn đang gặp rắc rối khi rất nhiều đối tượng đang tải hình phạt thời gian nhỏ sẽ giải quyết bộ nhớ giải phóng.

Sử dụng Time_Nanos ngủ để cho phép GC thu thập bộ nhớ. Cài đặt biến thành NULL là mong muốn.

Được thử nghiệm trên máy chủ sản xuất, ban đầu công việc tiêu thụ 50MB và sau đó bị dừng lại. Sau khi Nanos ngủ được sử dụng 14MB là mức tiêu thụ bộ nhớ liên tục.

Người ta nên nói điều này phụ thuộc vào hành vi GC có thể thay đổi từ phiên bản PHP sang phiên bản. Nhưng nó hoạt động trên PHP 5.3 tốt.

ví dụ. Mẫu này (Mã được lấy mẫu Virtuemart2 Nguồn cấp dữ liệu Google)

for($n=0; $n" . memory_get_usage() . "";//$ids[$n];
        time_nanosleep(0, 10000000);
    }

    $product = $productModel->getProductSingle((int)$ids[$n],true, true, true);
    ...

Đã trả lời ngày 19 tháng 11 năm 2012 lúc 20:23Nov 19, 2012 at 20:23

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Bệnh cao tầngOSP

1.4091 Huy hiệu vàng14 Huy hiệu bạc15 Huy hiệu đồng1 gold badge14 silver badges15 bronze badges

Đối với hồ sơ và loại trừ thời gian cần thiết:

First:
"; $x = str_repeat('x', 80000); echo memory_get_usage() . "
\n"; echo memory_get_peak_usage() . "
\n"; echo "
Unset:
"; unset($x); $x = str_repeat('x', 80000); echo memory_get_usage() . "
\n"; echo memory_get_peak_usage() . "
\n"; echo "
Null:
"; $x=null; $x = str_repeat('x', 80000); echo memory_get_usage() . "
\n"; echo memory_get_peak_usage() . "
\n"; echo "
function:
"; function test() { $x = str_repeat('x', 80000); } echo memory_get_usage() . "
\n"; echo memory_get_peak_usage() . "
\n"; echo "
Reasign:
"; $x = str_repeat('x', 80000); echo memory_get_usage() . "
\n"; echo memory_get_peak_usage() . "
\n";

Nó trở lại

Notice: Undefined variable: a in xxx
NULL
0

Kết luận, cả bộ nhớ miễn phí NULL và UNTEN như mong đợi (không chỉ vào cuối quá trình thực hiện). Ngoài ra, việc chỉ định lại một biến giữ giá trị hai lần tại một số điểm (520216 so với 438352)

Đã trả lời ngày 1 tháng 7 năm 2017 lúc 23:59Jul 1, 2017 at 23:59

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Magallanesmagallanesmagallanes

6.3074 Huy hiệu vàng52 Huy hiệu bạc53 Huy hiệu Đồng4 gold badges52 silver badges53 bronze badges

Php 7 đã được thực hiện trong các vấn đề quản lý bộ nhớ như vậy và việc sử dụng giảm tối thiểu.

Notice: Undefined variable: a in xxx
NULL
1

Php 7.1 Outpu:

mất 0,16778993606567 giây mất 0.16630101203918 giây

Đã trả lời ngày 27 tháng 6 năm 2018 lúc 5:54Jun 27, 2018 at 5:54

Ví dụ về mã từ bình luận

Notice: Undefined variable: a in xxx
NULL
2

Chạy trong container docker từ hình ảnh

NULL
4 và những người khác ..docker container from image
NULL
4 and others..

Notice: Undefined variable: a in xxx
NULL
3

Nhưng, với ví dụ khác:

Notice: Undefined variable: a in xxx
NULL
4

Results:

Notice: Undefined variable: a in xxx
NULL
5

Đã trả lời ngày 12 tháng 7 năm 2020 lúc 10:59Jul 12, 2020 at 10:59

Tôi vẫn nghi ngờ về điều này, nhưng tôi đã thử nó trong tập lệnh của mình và tôi đang sử dụng XDebug để biết nó sẽ ảnh hưởng đến việc sử dụng bộ nhớ ứng dụng của tôi như thế nào. Tập lệnh được đặt trên chức năng của tôi như thế này:

Notice: Undefined variable: a in xxx
NULL
6

Và tôi thêm Unset ngay trước mã

NULL
1 và nó cung cấp cho tôi: 160200 sau đó tôi cố gắng thay đổi nó với
NULL
6 và nó cho tôi: 160224 :)

Nhưng có một cái gì đó độc đáo trên so sánh này khi tôi không sử dụng unset () hoặc null, xdebug cho tôi 160144 làm cách sử dụng bộ nhớ

Vì vậy, tôi nghĩ rằng việc đưa ra dòng để sử dụng unset () hoặc null sẽ thêm quy trình vào ứng dụng của bạn và tốt hơn là nên giữ nguồn gốc với mã của bạn và giảm biến mà bạn đang sử dụng hiệu quả nhất có thể.

Sửa cho tôi nếu tôi sai, cảm ơn

Đã trả lời ngày 28 tháng 11 năm 2012 lúc 2:14Nov 28, 2012 at 2:14

Anggie Azizanggie AzizAnggie Aziz

1331 Huy hiệu vàng1 Huy hiệu bạc10 Huy hiệu đồng1 gold badge1 silver badge10 bronze badges

1

Tôi đã tạo một bài kiểm tra hiệu suất mới cho

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 và
NULL
8, bởi vì như đã đề cập trong các bình luận, ở đây đã viết có lỗi (tái tạo các yếu tố). Tôi đã sử dụng mảng, như bạn thấy nó không quan trọng bây giờ.

Notice: Undefined variable: a in xxx
NULL
7

Nhưng tôi chỉ có thể kiểm tra nó trên máy chủ Php 5.5.9, ở đây là kết quả: - đã mất 4.4571571350098 giây - đã mất 4.4425978660583 giây

Tôi thích

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 vì lý do dễ đọc.

Đã trả lời ngày 9 tháng 6 năm 2015 lúc 17:28Jun 9, 2015 at 17:28

Hướng dẫn how to release memory using in php - cách giải phóng bộ nhớ bằng php

Michael B.Michael B.Michael B.

7668 Huy hiệu bạc14 Huy hiệu đồng8 silver badges14 bronze badges

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
3 Mã nếu không giải phóng bộ nhớ ngay lập tức vẫn rất hữu ích và sẽ là một thông lệ tốt để thực hiện điều này mỗi khi chúng tôi chuyển các bước mã trước khi chúng tôi thoát khỏi một phương thức. Hãy lưu ý rằng nó không phải là giải phóng bộ nhớ ngay lập tức. Bộ nhớ ngay lập tức dành cho CPU, những gì về bộ nhớ phụ là RAM.

Và điều này cũng giải quyết về việc ngăn chặn rò rỉ bộ nhớ.

Vui lòng xem liên kết này http://www.hackingwithphp.com/18/1/11/be-wary-of- garbage-collection-part-2

Tôi đã sử dụng unset trong một thời gian dài bây giờ.

Thực hành tốt hơn như thế này trong mã để hủy bỏ tất cả các biến đã được sử dụng làm mảng.

Notice: Undefined variable: a in xxx
NULL
8


1 để giải phóng tất cả các cách sử dụng biến.

Vui lòng xem chủ đề liên quan đến UndT

Làm thế nào quan trọng đối với các biến số trong PHP?

[bug]

Đã trả lời ngày 29 tháng 10 năm 2015 lúc 19:53Oct 29, 2015 at 19:53

zero8zero8zero8

1.8993 huy hiệu vàng14 Huy hiệu bạc25 Huy hiệu đồng3 gold badges14 silver badges25 bronze badges

PHP không được đặt bộ nhớ miễn phí?

unset () thực hiện đúng những gì tên của nó nói - không đặt một biến. Nó không buộc giải phóng bộ nhớ ngay lập tức. Người thu gom rác của PHP sẽ làm điều đó khi thấy phù hợp - theo ý định sớm, vì những chu kỳ CPU đó không cần thiết, hoặc muộn như trước khi tập lệnh sẽ hết bộ nhớ, bất cứ điều gì xảy ra trước.It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first.

Làm thế nào tôi có thể giới hạn bộ nhớ PHP của mình?

'Memory_Limit' là lượng bộ nhớ máy chủ tối đa mà một tập lệnh PHP duy nhất được phép sử dụng.Giá trị cần được chuyển đổi trước khi so sánh ngưỡng của bộ nhớ.Ví dụ: 64m được chuyển đổi thành 64 * 1024 * 1024. Sau đó, việc so sánh được thực hiện và kết quả được in ra.The value needs to be converted before comparing the threshold of memory. For example − 64M is converted to 64 * 1024 * 1024. After this, the comparison is done and the result is printed out.

Điều gì tốt hơn trong việc giải phóng bộ nhớ bằng php unset () hoặc $ var null?

Kết luận: NULL sẽ tốt hơn nếu bộ nhớ cần ít hơn cho một biến.NULL is better if the memory needed is less for a variable.

Php quản lý bộ nhớ như thế nào?

Các chức năng quản lý bộ nhớ PHP được trình điều khiển gốc MySQL gọi thông qua trình bao bọc nhẹ.Trong số những người khác, trình bao bọc làm cho việc gỡ lỗi dễ dàng hơn.Máy chủ MySQL khác nhau và các API máy khách khác nhau phân biệt giữa các bộ kết quả được đệm và không có nội dung.invoked by the MySQL Native Driver through a lightweight wrapper. Among others, the wrapper makes debugging easier. The various MySQL Server and the various client APIs differentiate between buffered and unbuffered result sets.