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

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.

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

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

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

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; $ngetProductSingle[[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

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:

Bài Viết Liên Quan

Chủ Đề