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