PHP:如何手动停止方法/函数执行

时间:2018-11-16 15:57:51

标签: php angular laravel laravel-5.7

我有一种基于API服务同步和更新数据库的方法。通过套接字(TCP / IP)与API进行连接。 API提供了一项服务,用于返回已更新项目的所有ID,并提供另一项服务来获取包含已更新数据的项目。因此,我创建了一个同步方法,该方法获取更新项ID的列表,迭代该列表并更新每个项。 由于我必须在循环内部进行套接字连接才能获取商品详细信息,因此此过程可能需要一些时间,具体取决于要更新的​​商品数量。 因此,我希望允许客户根据需要取消/停止此过程。

用我当前的方法可以做到吗?还是我应该在客户端进行商品迭代并更改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 :(得分: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

您甚至可以在脚本中设置一个暂停,以减慢它的速度,并给用户更多的时间进行响应,等等。