PHP: Как вручную остановить выполнение метода / функции - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть метод, который синхронизирует и обновляет базу данных на основе службы 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 Ответ

0 голосов
/ 16 ноября 2018

Я просто подумал о решении. Вам нужно будет использовать сеансы. Вы хотите установить $_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 при нажатии.

Вы можете даже установить паузу в своем скрипте, чтобы замедлить его и дать пользователю больше времени для реакции и т. Д., Если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...