2010-08-06 70 views
8

Xuất phát từ nền C/C++, tôi thường sử dụng bộ sưu tập rác của riêng mình - tức là giải phóng tài nguyên sau khi sử dụng chúng (ví dụ: RAII trong vùng C++).Gọi hàm unset() trong tập lệnh PHP

Tôi thấy các biến mất của mình (chủ yếu là ORM) sau khi sử dụng chúng. Có bất kỳ lợi ích nào của thói quen này không?

Tôi nhớ đọc ở đâu đó một lúc, khiến các biến mất đánh dấu chúng để xóa sự chú ý của GC của PHP - có thể giúp sử dụng tài nguyên ở phía máy chủ - đúng hay sai?

[Chỉnh sửa]

tôi quên đề cập đến, tôi đang sử dụng PHP 5.3, và cũng hầu hết các unset() gọi tôi làm là trong một vòng lặp nơi tôi đang chế biến một số biến ORM 'nặng'

Trả lời

3

Tôi khuyên bạn nên cho this một đọc

3

Nếu một đối tượng rất lớn được sử dụng sớm trong một tập lệnh dài và không có cơ hội để đối tượng ra khỏi phạm vi, thì unset() có thể giúp sử dụng bộ nhớ. Trong hầu hết các trường hợp, các đối tượng nằm ngoài phạm vi và chúng được đánh dấu cho GC tự động.

0

Có thể đặc biệt là khi bạn đang xử lý các mảng lớn và tập lệnh yêu cầu nhiều thời gian để chạy.

0

Nếu không tìm kiếm một số bằng chứng, tôi sẽ nói rằng điều đó không quan trọng. Việc thu gom rác diễn ra tự động khi bạn rời khỏi một hàm hoặc một tập lệnh kết thúc. Vì vậy, trừ khi bạn đang thực sự bị ràng buộc vì tài nguyên, đừng bận tâm.

OK, đã tìm nội dung nào đó. Dưới đây là một trích dẫn tốt:

"Giải phóng bộ nhớ - đặc biệt lớn lượng - không được tự do về thời gian xử lý, điều này có nghĩa rằng nếu bạn muốn kịch bản của bạn để thực hiện như nhanh càng tốt tại chi phí của RAM, bạn nên tránh rác bộ sưu tập trên các biến lớn trong khi nó đang chạy, sau đó hãy để PHP thực hiện việc đó masse ở cuối tập lệnh. "

Để biết thêm về chủ đề kiểm tra các liên kết được cung cấp trong the first answer here.

0
  • tôi nghĩ các biến PHP chỉ được bảo quản thông qua cuộc đời của kịch bản của bạn, do đó, nó không thể giúp nhiều trừ khi kịch bản của bạn là đặc biệt là chạy dài hoặc sử dụng nhiều bộ nhớ tạm thời trong một bước.
  • Xóa rõ ràng có thể chậm hơn để cho phép tất cả được xóa tự động khi khởi động.
  • Bạn đang thêm nhiều mã hơn, thường sẽ làm cho mọi việc chậm hơn trừ khi bạn biết điều đó sẽ hữu ích.
  • Tối ưu hóa sớm, trong mọi trường hợp.
0

GC PHP thường đủ tốt để bạn thường không cần gọi hàm unset() trên các biến đơn giản. Tuy nhiên, đối với các đối tượng, GC sẽ chỉ tiêu diệt chúng khi chúng rời khỏi phạm vi và không có đối tượng nào khác đề cập đến chúng. Bỏ đặt có thể giúp với bộ nhớ trong trường hợp này.Xem http://us3.php.net/manual/en/language.references.unset.php

5

Tôi thấy rằng nếu bạn cần phải sử dụng rất nhiều unsetcủa bạn có thể làm nó sai. Hãy để phạm vi làm "unsetting" cho bạn. Hãy xem xét hai ví dụ:

1:

$var1 = f(...); 
.... 
unset($var1); 

$var2 = g(...); 
.... 
unset($var2); 

2:

function scope1() 
{ 
    $var1 = f(...); 
    .... 
} //end of function triggers release of $var1 

function scope2() 
{ 
    $var2 = g(...); 
    .... 
} //end of function triggers release of $var2 

scope1(); 
scope2(); 

Ví dụ thứ hai tôi sẽ thích hợp hơn vì nó xác định rõ phạm vi và làm giảm nguy cơ bị rò rỉ biến phạm vi toàn cầu (chỉ được phát hành ở cuối tập lệnh).

EDIT:

Một điều cần lưu ý là các unset trong PHP chi phí hơn (CPU) so với bộ sưu tập phạm vi rác bình thường. Trong khi sự khác biệt là nhỏ, nó đi để hiển thị như thế nào ít của một nhấn mạnh đội PHP đặt trên unset. Nếu bất cứ điều gì unset nên cung cấp cho PHP cái nhìn sâu sắc rằng về cách phát hành bộ nhớ, nhưng nó thực sự thêm vào thời gian thực hiện. unset thực sự chỉ là một hack để giải phóng các biến không còn cần thiết, trừ khi bạn làm điều gì đó khá phức tạp, sử dụng lại các biến (hoạt động như một biến số tự nhiên unset trên biến cũ) và phạm vi là tất cả các bạn cần .

function noop($value){} 

function test1() 
{ 
    $value = "something"; 
    noop($value); //make sure $value isn't optimized out 
} 

function test2() 
{ 
    $value = "something"; 
    noop($value); //make sure $value isn't optimized out 
    unset($value); 
} 

$start1 = microtime(true); 
for($i = 0; $i < 1000000; $i++) test1(); 
$end1 = microtime(true); 

$start2 = microtime(true); 
for($i = 0; $i < 1000000; $i++) test2(); 
$end2 = microtime(true); 

echo "test1 ".($end1 - $start1)."\n"; //test1 0.404934883118 
echo "test2 ".($end2 - $start2)."\n"; //test2 0.434437990189 
0

Tôi đã phải bỏ sử dụng khi bạn gặp sự cố về bộ nhớ khi lặp qua và tạo bản sao của mảng. Tôi sẽ nói không sử dụng nó trừ khi bạn đang ở trong tình huống này quảng cáo GC sẽ tự động khởi động.

Các vấn đề liên quan