PHP:如何手动停止 method/function 执行
PHP: How to manually stop a method/function execution
我有一种基于 API 服务同步和更新数据库的方法。与 API 的连接是通过套接字 (TCP/IP) 建立的。 API 有一个服务 return 所有更新项目的 id 和另一个获取具有更新数据的项目。因此,我创建了一个同步方法来获取更新的项目 ID 列表,迭代列表并更新每个项目。
由于我必须在循环内建立套接字连接以获取项目详细信息,因此此过程可能需要一些时间,具体取决于要更新的项目数 os。
出于这个原因,如果需要,我想允许客户cancel/stop这个过程。
这个pos可以用我目前的方法完成吗?或者我应该在客户端进行项目迭代并更改 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;
}
我刚刚想到了解决办法。您需要使用会话。
您希望在 foreach()
开始之前设置 $_SESSION['halt'] = false
。
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
。
如果您愿意,您甚至可以在脚本中设置暂停以减慢速度并给用户更多时间做出反应等。
我有一种基于 API 服务同步和更新数据库的方法。与 API 的连接是通过套接字 (TCP/IP) 建立的。 API 有一个服务 return 所有更新项目的 id 和另一个获取具有更新数据的项目。因此,我创建了一个同步方法来获取更新的项目 ID 列表,迭代列表并更新每个项目。 由于我必须在循环内建立套接字连接以获取项目详细信息,因此此过程可能需要一些时间,具体取决于要更新的项目数 os。 出于这个原因,如果需要,我想允许客户cancel/stop这个过程。
这个pos可以用我目前的方法完成吗?或者我应该在客户端进行项目迭代并更改 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;
}
我刚刚想到了解决办法。您需要使用会话。
您希望在 foreach()
开始之前设置 $_SESSION['halt'] = false
。
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
。
如果您愿意,您甚至可以在脚本中设置暂停以减慢速度并给用户更多时间做出反应等。