VPS full CPU vì code file_get_contents đọc tệp có kích thước lớn

Tôi có 1 khách hàng sử dụng code để đọc 1 file có tên là logP.txt, file này nặng hơn 30MB nên CPU của máy chủ mạnh dù mạnh vẫn phải vất vả để mở file và đọc file và tìm dữ liệu có điều kiện như thế này.

Để giải quyết vấn đề này, bạn có thể đọc giải pháp dưới đây để xử lý nếu có gặp phải.

Khi có một tệp tin logP.txt quá lớn, việc đọc và tìm kiếm toàn bộ nội dung cùng một lúc có thể gây tắc nghẽn tài nguyên CPU và làm cho máy chủ VPS bị quá tải. Để giải quyết vấn đề này, bạn có thể sử dụng phương pháp đọc tệp tin theo từng phần nhỏ (chunks) để giảm tải CPU và tối ưu hóa mã.

Dưới đây là một phiên bản tối ưu hơn của mã code của bạn, sử dụng phương pháp đọc theo chunks:

// Đường dẫn đến file txt
$file_path = 'logP.txt';

// Đọc nội dung file vào biến
$file_contents = file_get_contents($file_path);

// Tìm kiếm chuỗi trong file
$search_string = $_GET["phone"];
if (strpos($file_contents, $search_string) !== false) {
    // Trả về true nếu tìm thấy chuỗi
    $response = array('success' => true);
    echo json_encode($response);
} else {
    // Trả về false nếu không tìm thấy chuỗi
    $response = array('success' => false);
    echo json_encode($response);
    
}

Giải pháp để xử lý vấn đề này là sử dụng hàm fread để đọc tệp tin theo từng phần nhỏ (chunks) với kích thước 4KB (4096 bytes) mỗi lần. Khi tìm thấy chuỗi, chúng sẽ đánh dấu là đã tìm thấy và dừng việc đọc file bằng cách sử dụng break.

Với cách tiếp cận này, việc tìm kiếm chuỗi trong tệp tin logP.txt sẽ không gây tắc nghẽn tài nguyên CPU và giúp tối ưu hóa mã của bạn.

// Đường dẫn đến file txt
$file_path = 'logP.txt';

// Tìm kiếm chuỗi trong file
$search_string = $_GET["phone"];

// Mở tệp tin để đọc
$file_handle = fopen($file_path, 'r');

// Biến để kiểm tra xem chuỗi có được tìm thấy hay không
$found = false;

// Đọc file theo từng phần nhỏ (chunks) và tìm kiếm chuỗi
while (!feof($file_handle)) {
    $chunk = fread($file_handle, 4096); // Đọc 4KB (4096 bytes) mỗi lần
    if (strpos($chunk, $search_string) !== false) {
        // Nếu tìm thấy chuỗi, đánh dấu là đã tìm thấy và dừng việc đọc file
        $found = true;
        break;
    }
}

// Đóng file
fclose($file_handle);

// Trả về kết quả
$response = array('success' => $found);
echo json_encode($response);

Tuy nhiên, đây không phải là giải pháp tối ưu, vẫn sẽ tốn rất nhiều bộ nhớ và CPU để chạy code ở case này, giải pháp tốt nhất là không dùng file tĩnh như trên mà thêm dữ liệu vào sql thì việc truy xuất mới được tối ưu.

Nếu bạn thấy bài viết có ích hãy sao chép link và chia sẻ bài viết
daotiendung

Tiến Dũng Đào chuyên quản lý, vận hành các dịch vụ website. Anh có nhiều năm kinh nghiệm về VPS, Hosting, technical SEO, CMS. Đặc biệt yêu thích WordPress với hơn 5 năm phát triển theme và plugin. Sở thích của anh là đọc, viết blog, đi du lịch, tập võ và chia sẻ các kiến thức cho mọi người.

Bài viết liên quan