Để đả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:
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:
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);
}
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
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.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.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 đó.