Để đảm bảo rằng media_list.php chỉ chạy một lần mỗi phút và không chạy lại nếu phiên bản trước vẫn chưa kết thúc, bạn có thể sử dụng một cơ chế khóa (lock) trong cron job. Cách này có thể được thực hiện thông qua việc kiểm tra sự tồn tại của một tệp tạm thời (lock file) trước khi thực thi.

Dưới đây là cách bạn có thể thay đổi mã PHP và cron job để đạt được điều này:

1. Sử dụng Lock File trong PHP

Bạn có thể tạo một tệp lock khi bắt đầu thực thi và xóa tệp này sau khi hoàn thành công việc. Nếu tệp lock tồn tại, quá trình sẽ không được thực hiện lại.

Thêm đoạn mã dưới đây vào đầu và cuối của file media_list.php:

Mã PHP (media_list.php):

<?php

$lockFile = __DIR__ . '/media_list.lock';

// Kiểm tra xem lock file có tồn tại không (nếu có thì không chạy lại)
if (file_exists($lockFile)) {
    echo "Process is already running.n";
    exit; // Dừng script nếu có một process đang chạy
}

// Tạo lock file để ngăn không cho các tiến trình khác chạy
file_put_contents($lockFile, "locked");

// Đảm bảo sau khi chạy xong, sẽ xóa lock file
register_shutdown_function(function() use ($lockFile) {
    // Xóa lock file khi kết thúc
    unlink($lockFile);
});

global $wpdb;

$query = "
    SELECT p.ID, p.post_title, p.post_date
    FROM {$wpdb->posts} p
    LEFT JOIN {$wpdb->prefix}gdrive_images g ON p.ID = g.post_id
    WHERE p.post_type = 'product'
    AND p.post_status = 'publish'
    AND g.post_id IS NULL
    ORDER BY p.ID DESC
    LIMIT 10
";

$results = $wpdb->get_results($query);

// Hiển thị tiêu đề của các bài viết
foreach ($results as $post) {
    $cmd = PHP_EXE . " " . __DIR__ . "/media.php {$post->ID}";
    echo "$cmdn";
    flush();  // Đảm bảo dữ liệu được gửi ra ngay lập tức
    ob_flush();  // Đảm bảo buffer được xả
    shell_exec($cmd);
}

2. Cron Job Configuration

Cron job của bạn có thể được thiết lập để chạy media_list.php mỗi phút. Đảm bảo rằng chỉ một tiến trình sẽ chạy mỗi lần, bằng cách dựa vào lock file đã được tạo trong đoạn mã trên.

Cron job để chạy mỗi phút:

Chạy media_list.php mỗi phút bằng cách thêm dòng sau vào crontab của bạn (dùng lệnh crontab -e):

* * * * * /usr/bin/php /var/www/domain.com/public_html/media_list.php

Giải thích:

  1. Lock File:
    • Khi script bắt đầu, nó sẽ kiểm tra xem tệp lock (media_list.lock) có tồn tại không. Nếu có, script sẽ thoát ngay mà không thực hiện thêm hành động nào, đảm bảo rằng chỉ có một tiến trình chạy.
    • Sau khi script bắt đầu chạy, nó sẽ tạo tệp lock để ngăn các tiến trình khác chạy.
    • Khi script kết thúc (hoặc gặp lỗi), hàm register_shutdown_function sẽ được gọi để xóa lock file, cho phép script chạy lại trong lần tiếp theo.
  2. Cron Job:
    • Cron job chạy mỗi phút, nhưng do cơ chế khóa, script chỉ thực thi nếu không có tiến trình nào trước đó đang chạy.

Với cách này, bạn sẽ đảm bảo rằng chỉ có một phiên bản của media_list.php được chạy mỗi phút, và nếu một lần chạy mất quá nhiều thời gian (chưa kết thúc), sẽ không có phiên bản nào khác được chạy trong khoảng thời gian đó.