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