2016-06-15 27 views
7

Hôm qua, tôi đã học được rằng PHP có phương thức yield(). Tôi đã không chắc chắn về tính hữu ích của nó trong PHP.Hiệu suất PHP so với PDO tìm nạp?

Một đồng nghiệp cho biết nó có thể giúp cho các câu lệnh SQL trả về nhiều hàng gây ra các vấn đề về bộ nhớ tiềm ẩn. Tôi tin rằng anh ấy đang đề cập đến fetchAll(). Nhưng thay vì sử dụng fetchAll(), bạn cũng có thể sử dụng fetch() và xử lý từng hàng một. Vì vậy, yield() không phải là chìa khóa để giải quyết vấn đề mà anh ta đang đề cập đến.

Tôi có thiếu gì đó về số yield()fetch() tại đây không? Có nhiều lợi ích hơn khi sử dụng yield() và máy phát điện không?

P .: Đúng là viết mã sạch, dễ đọc và có thể đọc được dễ dàng hơn trong các ứng dụng lớn với yield() so với fetch().

+3

Vâng, PDO không phải là một ví dụ rất tốt cho năng suất usefilness, vì PDO tuyên bố đã thực hiện một giao diện đi ngang và có thể được lặp lại qua việc sử dụng foreach. Nhưng với mysqli bạn có thể sử dụng năng suất để làm cho kết quả mysqli được lặp lại với foreach. –

+1

Vâng, nói chung điều này đi xuống đến những gì * máy phát điện * là hữu ích cho (nguyên nhân 'yield' là một chi tiết thực hiện của máy phát điện). Và các trình tạo ra có ích cho việc tạo ra một cái gì đó hoạt động giống như một mảng (hay đúng hơn là * lặp lại *), nhưng không lưu trữ tất cả dữ liệu của nó trong bộ nhớ nhưng * tạo * nó với mỗi lần lặp nếu cần. Có, điều này có thể được sử dụng trong bối cảnh tìm nạp các kết quả cơ sở dữ liệu, nhưng cũng có thể được sử dụng để thực hiện một bộ đếm vô hạn hoặc bất kỳ số nào khác. – deceze

Trả lời

9

Vì vậy, yield() không phải là chìa khóa để giải quyết vấn đề mà anh ta đang đề cập đến.

Chính xác.

Nhưng nó có thể cho phép bạn ngụy trang while()/fetch() chuỗi dưới dạng cuộc gọi foreach() nếu bạn muốn, mà không cần phí trên bộ nhớ.

Tuy nhiên, PDO không phải là một ví dụ rất tốt, bởi vì PDOStatement đã thực hiện một giao diện traversable và do đó can be iterated over using foreach():

$stmt = $pdo->query('SELECT name FROM users'); 
foreach ($stmt as $row) 
{ 
    var_export($row); 
} 

Vì vậy, chúng ta hãy mysqli cho ví dụ API mà chỉ có thể dẫn đến từng người một dòng.
Chỉnh sửa. Trên thực tế, since 5.4.0 mysqli supports Traversable là tốt, vì vậy không có điểm trong việc sử dụng năng suất với mysqli_result. Nhưng meh, hãy giữ nó cho mục đích trình diễn.

Hãy tạo một máy phát điện như thế này

function mysqli_gen (mysqli_result $res) 
{ 
    while($row = mysqli_fetch_assoc($res)) 
    { 
     yield $row; 
    } 
} 

và bây giờ bạn có thể nhận được hàng sử dụng foreach mà không có một overhead:

$res = $mysqli->query("SELECT * FROM users"); 
foreach (mysqli_gen($res) as $row) 
{ 
    var_export($row); 
} 
Các vấn đề liên quan