CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này thảo luận về các công cụ tối ưu hóa hiệu suất trong PHP mà có thể bạn đã bỏ qua: các trình tạo được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Lời nói đầu.
Nếu bạn đang làm việc bằng python hoặc các ngôn ngữ khác, bạn nên làm quen với trình tạo. Nhưng nhiều nhà phát triển PHP có thể không biết chức năng của trình tạo. Có thể là do trình tạo là một hàm được giới thiệu trong PHP 5.5.0, hoặc có thể chức năng của trình tạo không rõ ràng lắm. Tuy nhiên, chức năng tạo thực sự rất hữu ích.
Trong trường hợp nào bạn sẽ gặp phải vấn đề về hiệu suất PHP?
1: Sử dụng cú pháp php không đúng cách.
2: Sử dụng ngôn ngữ php để làm những việc chưa tốt.
3: Dịch vụ được kết nối bằng ngôn ngữ php không mạnh mẽ.
4: Những hạn chế của PHP (điều mà bản thân PHP không làm được).
5: Một vấn đề mà chúng tôi cũng không biết? (Tìm tòi, phân tích, tìm giải pháp và nâng cao trình độ phát triển).
lợi thế.
Nếu nói trực tiếp về khái niệm này, tôi đoán sau khi nghe xong bạn vẫn sẽ bối rối, vì vậy hãy nói về ưu điểm trước, điều này có thể sẽ khơi dậy sự quan tâm của bạn. Vậy ưu điểm của máy phát điện là gì, cụ thể như sau:
- Trình tạo có thể có tác động rất lớn đến hiệu suất của các ứng dụng PHP
- Tiết kiệm rất nhiều bộ nhớ khi mã php đang chạy
- Phù hợp hơn cho việc tính toán lượng dữ liệu lớn
Vậy làm thế nào để đạt được những chức năng kỳ diệu này? Hãy đưa ra một ví dụ đầu tiên.
Giới thiệu khái niệm.
Đầu tiên, hãy gạt bỏ gánh nặng của khái niệm trình tạo sang một bên và xem xét một hàm PHP đơn giản:
?
1
2
3
4
5
6
7
|
chức năng
tạo ra phạm vi(
$số
){
$dữ liệu
= [];
vì
(
$tôi
=0;
$tôi
<
$số
;
$tôi
++){
$dữ liệu
[] = thời gian();
}
trở lại
$dữ liệu
;
}
|
Đây là một hàm php rất phổ biến mà chúng ta thường sử dụng khi xử lý một số mảng. Mã ở đây cũng rất đơn giản:
- Chúng tôi tạo ra một chức năng.
- Hàm chứa vòng lặp for. Chúng tôi lặp thời gian hiện tại vào dữ liệu $.
- Sau khi vòng lặp for được thực thi, $data sẽ được trả về.
Nó vẫn chưa kết thúc, hãy tiếp tục. Hãy viết một hàm khác và in ra giá trị trả về của hàm này trong một vòng lặp:
?
1
2
3
4
5
|
$kết quả
= tạo phạm vi(10);
foreach
(
$kết quả
BẰNG
$giá trị
){
ngủ(1);
tiếng vọng
$giá trị
.
' '
;
}
|
Chúng ta hãy xem kết quả trên trình duyệt:

Nó hoàn hảo, không có vấn đề gì cả. (Tất nhiên là bạn không thể thấy được tác dụng của giấc ngủ(1)).
Hãy suy nghĩ về một câu hỏi.
Chúng tôi nhận thấy rằng khi gọi hàm createrange, giá trị được truyền cho $number là 10, một con số rất nhỏ. Giả sử bây giờ giá trị 10000000 (10 triệu) được thông qua.
Sau đó, trong hàm createrange, vòng lặp for cần được thực thi 10 triệu lần. Và 10 triệu giá trị được đặt trong $data và mảng $data được đặt trong bộ nhớ. Vì vậy, rất nhiều bộ nhớ sẽ bị chiếm dụng khi gọi hàm.
Ở đây, máy phát điện có thể phát huy tác dụng.
Tạo máy phát điện.
Chúng tôi sửa đổi mã trực tiếp, vui lòng chú ý:
?
1
2
3
4
5
|
chức năng
tạo ra phạm vi(
$số
){
vì
(
$tôi
=0;
$tôi
<
$số
;
$tôi
++){
thời gian sinh lời();
}
}
|
Hãy xem đoạn mã này rất giống với đoạn mã vừa rồi. Chúng tôi đã xóa mảng $data và không trả về bất kỳ thứ gì. Thay vào đó, chúng tôi đã sử dụng từ khóa năng suất trước time().
Sử dụng máy phát điện.
Hãy chạy lại đoạn mã thứ hai:
$result = createrange(10); // Ở đây chúng ta gọi hàm chúng ta đã tạo ở trên foreach($result as $value){ sleep(1); echo $value.'
';

Chúng tôi đã phát hiện ra một cách kỳ diệu rằng giá trị đầu ra đã khác so với lần đầu tiên không sử dụng trình tạo. Các giá trị (dấu thời gian) ở đây cách nhau 1 giây.
Khoảng thời gian một giây ở đây thực sự là kết quả của giấc ngủ (1). Nhưng tại sao lại không có khoảng cách trong lần đầu tiên? Đó là bởi vì:
- Khi không sử dụng trình tạo: kết quả của vòng lặp for trong hàm createrange sẽ nhanh chóng được đặt vào $data và được trả về ngay lập tức. Do đó, vòng lặp foreach là một mảng cố định.
- Khi sử dụng trình tạo: giá trị của createrange không được tạo nhanh chóng cùng một lúc mà phụ thuộc vào vòng lặp foreach. vòng lặp foreach một lần và for được thực hiện một lần.
Tại thời điểm này, bạn nên có một ý tưởng về máy phát điện.
Hiểu biết sâu sắc về máy phát điện.
Hồ sơ mã.
Hãy phân tích mã ngay bây giờ.
?
1
2
3
4
5
6
7
8
9
10
|
chức năng
tạo ra phạm vi(
$số
){
vì
(
$tôi
=0;
$tôi
<
$số
;
$tôi
++){
thời gian sinh lời();
}
}
$kết quả
= tạo phạm vi(10);
foreach
(
$kết quả
BẰNG
$giá trị
){
ngủ(1);
tiếng vọng
$giá trị
.
' '
;
}
|
Hãy khôi phục quá trình thực thi mã.
- Đầu tiên, hàm createrange được gọi, truyền tham số 10, nhưng giá trị for được thực thi một lần rồi dừng lại và foreach được cho biết giá trị có thể được sử dụng cho vòng lặp đầu tiên.
- foreach bắt đầu lặp qua kết quả $, chế độ ngủ đầu tiên (1) và sau đó bắt đầu sử dụng giá trị do for cung cấp để thực hiện đầu ra.
- foreach chuẩn bị cho vòng lặp thứ hai. Trước khi bắt đầu vòng lặp thứ hai, nó đưa ra một yêu cầu khác cho vòng lặp for.
- Vòng lặp for sau đó được thực thi lại và dấu thời gian được tạo sẽ được yêu cầu foreach.
- foreach lấy giá trị thứ hai và xuất ra nó. Do chế độ ngủ (1) trong foreach, vòng lặp for bị trễ 1 giây để tạo thời gian hiện tại.
Do đó, trong toàn bộ quá trình thực thi mã, luôn chỉ có một giá trị bản ghi tham gia vào vòng lặp và chỉ có một phần thông tin trong bộ nhớ.
Cho dù số $ được truyền vào lúc đầu lớn đến mức nào, vì không phải tất cả các tập kết quả đều được tạo ngay lập tức nên bộ nhớ luôn là một vòng lặp các giá trị.
Sự hiểu biết khái niệm.
Đến đây chắc hẳn bạn đã hiểu sơ bộ về máy phát điện là gì. Hãy nói về nguyên lý máy phát điện dưới đây.
Trước tiên, hãy làm rõ một khái niệm: từ khóa lợi nhuận của trình tạo không phải là giá trị trả về, thuật ngữ chuyên môn của nó được gọi là giá trị đầu ra, chỉ tạo ra một giá trị.
Vậy vòng lặp foreach trong mã là gì? Trong thực tế, khi PHP sử dụng một trình tạo, nó sẽ trả về một đối tượng của lớp trình tạo. foreach có thể lặp lại đối tượng. Với mỗi lần lặp, PHP sẽ tính toán giá trị cần lặp tiếp theo thông qua instance của trình tạo. Bằng cách này, foreach sẽ biết giá trị cần lặp tiếp theo.
Hơn nữa, sau khi vòng lặp for được thực thi trong quá trình hoạt động, nó sẽ dừng ngay lập tức. Khi foreach yêu cầu lại giá trị tiếp theo vào lần lặp tiếp theo, vòng lặp for sẽ thực thi lại và sau đó dừng lại ngay lập tức. Nó sẽ không được thực hiện cho đến khi các điều kiện không được đáp ứng.
Ứng dụng phát triển thực tế.
Nhiều nhà phát triển PHP không hiểu các trình tạo. Trên thực tế, họ chủ yếu không hiểu lĩnh vực ứng dụng. Vậy ứng dụng của máy phát điện trong thực tế phát triển là gì?
Đọc các tập tin rất lớn.
Việc phát triển PHP thường yêu cầu đọc các tệp lớn, chẳng hạn như tệp csv, tệp văn bản hoặc một số tệp nhật ký. Nếu những tệp này lớn, chẳng hạn như 5g. Tại thời điểm này, việc đọc trực tiếp tất cả nội dung vào bộ nhớ cùng một lúc để tính toán là không thực tế.
Đây là nơi máy phát điện có ích. Hãy lấy một ví dụ đơn giản: đọc một tập tin văn bản.

Chúng ta tạo một tài liệu văn bản và nhập một vài dòng văn bản để thể hiện khả năng đọc.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
tiêu đề(
"kiểu-nội-dung:văn-bản/html;bộ-ký-tự=utf-8"
);
chức năng
đọctxt()
{
# mã số...
$xử lý
=
fopen
(
"./test.txt"
,
'rb'
);
trong khi
(
của
(
$xử lý
)===sai) {
# mã số...
năng suất
fgets
(
$xử lý
);
}
đóng(
$xử lý
);
}
foreach
(đọctxt()
BẰNG
$chìa khóa
=>
$giá trị
) {
# mã số...
tiếng vọng
$giá trị
.
' '
;
}
|

Từ kết quả đầu ra trong hình trên, chúng ta có thể thấy đoạn mã này hoàn toàn bình thường.
Tuy nhiên, các quy tắc thực thi mã đằng sau nó hoàn toàn khác nhau. Sử dụng trình tạo để đọc tệp lần đầu tiên, dòng thứ hai được đọc lần thứ hai, v.v., mỗi lần chỉ có một dòng văn bản được tải vào bộ nhớ, điều này làm giảm đáng kể bộ nhớ. sử dụng.
Bằng cách này, bạn không phải lo lắng ngay cả khi đọc văn bản của G. Bạn có thể viết mã giống như đọc một tệp nhỏ.
Tóm tắt.
Trên đây là toàn bộ nội dung bài viết mong rằng nội dung bài viết có giá trị tham khảo nhất định cho quá trình học tập, làm việc của mọi người. Nếu có thắc mắc gì có thể để lại tin nhắn để trao đổi.
Liên kết gốc: https://segmentfault.com/a/1190000012334856.
Cuối cùng, bài viết này về công cụ tối ưu hóa hiệu suất trong PHP mà bạn có thể bỏ qua: trình tạo kết thúc ở đây. Nếu bạn muốn biết thêm về công cụ tối ưu hóa hiệu suất trong PHP mà bạn có thể bỏ qua: trình tạo, vui lòng tìm kiếm bài viết CFSDN. duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!