Я буду использовать пример, чтобы продемонстрировать это.
Предполагая, что у меня есть база данных MySQL, в которой я помещаю пути к файлам, которые нужно загрузить на S3, и столбец состояния, где каждому файлу присваивается либо pending
или uploaded
строка.
У меня есть сценарий PHP, upload.php
, который я могу запустить с php upload.php
и получать вывод, записанный в мой терминал по мере выполнения сценария. Я хотел бы настроить задание cron, которое запускает сценарий через определенные промежутки времени, скажем, каждые 30 минут, где каждый раз, когда запрашивается БД, и файлы, содержащие статус pending
, обрабатываются для загрузки.
Теперь я хочу иметь возможность отслеживать ход выполнения скрипта независимо от его текущего статуса во внешнем интерфейсе (если в настоящее время в БД нет ожидающих элементов).
Хотя я был бы признателен за любые уточнения c предложение о том, как это сделать, мой вопрос также касается наилучшей практики - то есть, каков правильный способ сделать это?
Вот пример такого сценария (он использует Джошкам MysqliDb )
// Get items with a pending status
function get_items_queue() {
global $db;
$cols = Array ("id", "filename");
$db->where('status = "pending"');
return $db->get('files', null, $cols);
}
// Upload items to S3
function UploadToS3($filename) {
if (empty($filename)) {
return false;
}
include_once('/s3/aws-autoloader.php');
$s3 = new S3Client($somearray); // Some S3 credentials here
// Print status
echo $filename . ' is uploading';
$uploaded = $s3->putObject($somearray); // Uploading to S3
if ($s3->doesObjectExist($s3_bucket, $filename)) {
// Print status
echo $filename . ' was uploaded';
} else {
// Print status
echo 'There has been an issue while uploading ' . $filename;
}
}
// Run the script
$queue_items = get_items_queue();
foreach ($queue_items as $key => $item) {
$upload = UploadToS3($item['filename']);
// Some function here that changes the status column for the uploaded item to 'uploaded'
if ($upload) {
set_item_queue_status($item['id']);
}
}