PHP: Как вручную остановить выполнение метода / функции
У меня есть метод, который синхронизирует и обновляет базу данных на основе службы API. Соединение с API осуществляется через Socket (TCP/IP). В API есть служба для возврата всех идентификаторов обновленных элементов, а другая - для получения элемента с обновленными данными. Итак, я создал метод синхронизации, который получает список обновленных идентификаторов элементов, повторяет список и обновляет каждый элемент. Поскольку для получения подробной информации об элементе необходимо установить сокет-соединение внутри цикла, этот процесс может занять некоторое время в зависимости от количества обновляемых элементов. По этой причине я хотел бы разрешить клиенту отменить / остановить этот процесс при желании.
Возможно ли это сделать с помощью моего текущего метода? Или я должен выполнить итерацию элементов на стороне клиента и изменить API для обновления одного элемента при каждом запросе?
Клиентское приложение на Angular и API на PHP.
ОБНОВЛЕНИЕ: Пример текущего метода синхронизации:
public static function syncItems()
{
$response = -1;
try {
//get all updated item ids from api
$updatedItemIds = self::getUpdatedItemIDs(); //connection to tcp/ip socket
if (isset($updatedItemIds)) {
$totalItems = count($updatedItemIds);
$updatedIems = 0;
//iterate all ids and get the item details
foreach ($updatedItemIds as $id) {
//get updated item data from api
$updatedItem = self::getItemDetails($id); //connection to tcp/ip socket
if (isset($updatedItem)) {
//get local version o the item
$item = Item::find($id);
//if item doesn't exist create a new one
if (!isset($item)) {
$item = new item();
}
//update item data
$item->id = $updatedItem->id
$item->name = $updatedItem->name;
$item->description = $updatedItem->description;
//save or update item details in DB
if ($item->save()) {
//increment updated items
$updateditems++;
} else {
//not saved
}
} else {
//not set
}
}
$response = $totalitems - $updateditems;
}
else
{
//no items to sync...
}
} catch (Exception $ex) {
//ooppsss!
}
return $response;
}
1 ответ
Я просто подумал о решении. Вам нужно будет использовать сеансы. Вы хотели бы установить $_SESSION['halt'] = false
перед foreach()
началось.
foreach ($updatedItemIds as $id) {
if($_SESSION['halt'] === true)) {
$_SESSION['halt'] = false; //set back to false immediate.
die;
}
//The socket connection would never get made if the above evaluated to true.
$updatedItem = self::getItemDetails($id); //connection to tcp/ip socket
}
У кнопки на пользовательском конце есть указатель на другой скрипт, который просто устанавливает $_SESSION['halt'] == true
при нажатии.
Вы можете даже установить паузу в своем скрипте, чтобы замедлить его и дать пользователю больше времени для реакции и т. Д., Если хотите.