У меня есть следующая проблема:
У меня есть бэкенд в php на платформе codeigniter, где я получу данные о весе от машины весов, которая отправляется из внешнего приложения C # (не может изменить это приложение C #). Я буду получать данные о весе каждый раз, когда весовщик будет обновлять значение, например, оно будет начинаться с 0, 100, 300, 400, 1000, 1500, 600, 400, 300, 100 и обратно до 0 (оно будет сброшено когда продукт находится за пределами шкалы), и все эти значения генерируются по одной записи в секунду, поэтому я буду иметь их быстро, и вставлю это в мою базу данных mysql с помощью этой функции:
public function balance() {
$evType = $this->input->post('eventType');
$weight = $this->input->post('balanceWeight');
if ($evType !== false && $weight !== false) {
$evType = intval($evType);
$weight = intval($weight);switch($this->balance_events->insert($evType, $weight)) {
case OpResult::Ok;
$this->_issue_success();
if($weight>100){
$insert_id = $this->db->insert_id();
$this->Curlsynologyapi->CURLsaveimage($insert_id);
}
break;
case OpResult::InvalidParameters;
$this->_issue_respond_with_reason("Not all parameters were supplied.", HttpResponse::BadRequest);
break;
case OpResult::Failed:
$this->_issue_respond_with_reason("Internal server error occured while inserting the balance entry. Please try again ...", HttpResponse::InternalServerError);
break;
default:
break;
}
}
}
Таким образом, чтобы объяснить этот быстрый, $ weight будет содержать значение веса (игнорируйте $ evType, который является некоторым масштабным выравниванием). И это придется держать и вставлять данные быстро, как только появятся новые значения. Теперь у меня будет условие: если ($ вес> 100) когда это ИСТИНА, я перехожу к другой функции, которую я перечислю выше, для этого нужно сделать экран печати камеры и сохранить это изображение на моем сервере в выбранной папке и присвоить ему имя с идентификатором значения веса, который был вставлен в mysql. , Это то, что я называю после моего утверждения if:
public function CURLsaveimage($insert_id) {
$datasidget = $this->curl->simple_get('blablabla this is my api login url');
$datasid = json_decode($datasidget,true);
$data_sid = $datasid['data']['sid'];
$reqUrl = "blabla this is my print screen from a live camera api url";
$imageencode = $this->curl->simple_get($reqUrl);
$path = "./images/$insert_id";
write_file($path, $imageencode, $mode = 'wb');
}
Выполнение запросов API от моей последней функции займет около 30-40 секунд, и это очень сильно по сравнению со скоростью, я получу значения веса (1 вход / сек). И когда if сработает и запустит запросы API, я пропущу все данные о весе, пока запросы не будут выполнены. Дело в том, что я могу позволить себе получить 1 экран печати за сеанс весов (это означает, что когда кто-то положит что-то на весы, мне нужно сделать 1 экран печати при срабатывании условия, а затем дождаться следующего взвешивающего события, весы). не будет генерировать безостановочные данные, но когда они генерируются, я должен получить их быстро).
Я думал о том, чтобы сделать запрос к процессу API параллельно, чтобы поток весовых событий не затрагивался, и когда запрос API завершился, начните снова, чтобы проверить, когда произойдет ли сбой, и так далее, я бы также например, могу ли я иметь некоторый контроль над этим параллельным процессом, чтобы использовать его для сна или что-то еще.
Я читал немного о php работниках и потоках, я видел redis, german, heroku, но, если честно, они кажутся немного сложными для понимания, и документация довольно тонкая для этого, и я также думаю, что они слишком много для моей проблемы ,
Вопрос: есть ли что-нибудь легкое и доступное для тех, кто не настолько продвинут в php?
Большое вам спасибо за ваше время!
Да, вы можете составить простую очередь задач самостоятельно.
Каждый раз, когда вам нужно запросить API, вы создадите задачу и сохраните ее в своей базе данных в некоторой пользовательской таблице, где хранятся только задачи. Поскольку мы только сохраняем задачу в базу данных, а не делаем запросы API здесь, это быстро.
Теперь у нас есть очередь (таблица в базе данных) с задачами, которые нужно выполнить, поэтому теперь нам нужен некоторый php-работник, чтобы получить одну задачу из очереди и выполнить ее.
Создайте простой скрипт php, который получит одну задачу из базы данных (например, "select * from tasks limit 1"
), выполняет его, а затем удаляет эту задачу из базы данных после завершения (или может изменить состояние задачи).
Теперь у нас есть только одна проблема, кто и когда будет запускать этот скрипт? Мы можем использовать хрон за это. Например, мы можем запланировать запуск нашего скрипта каждую минуту.
Например, php скрипт может запускаться каждую минуту cron.
И ваш код будет выглядеть так:
switch($this->balance_events->insert($evType, $weight)) {
case OpResult::Ok;
$this->_issue_success();
if($weight>100){
$insert_id = $this->db->insert_id();
$saveCameraImageTask = new SaveCameraImageTask($insert_id);
$saveCameraImageTask->save()//save it to database, we are just saving it to our database, no api request, so it is fast.
}
break;
case OpResult::InvalidParameters;
$this->_issue_respond_with_reason("Not all parameters were supplied.", HttpResponse::BadRequest);
break;
case OpResult::Failed:
$this->_issue_respond_with_reason("Internal server error occured while inserting the balance entry. Please try again ...", HttpResponse::InternalServerError);
break;
default:
break;
}
Других решений пока нет …