我有一个带有php后端的web应用程序。 在某个时间间隔,需要对所有用户运行检查。运行这些检查需要一些时间,更重要的是:它们不应该在不存在的用户上执行。从数据库接收用户,并且可以通过运行检查来中途改变。我目前的解决方案是:
<?php
require_once 'databaseUtils.php';
$users = getUsersFromDatabase();
//Sample:
while(true) {
foreach(GetUsers() as &$user) {
//I'd rather not:
if(checkIfUserIsInDatabase($user) {
var_dump($user);
sleep(1); //Checking takes time...
}
}
echo "Going again in 5s!";
sleep(5); //Interval
}
function GetUsers() {
return $users;
}
//Called from outside
function removeUser($user) {
global $users;
removeUserFromDatabase($user);
if(($key = array_search($user, $users)) !== false) {
unset($users[$key]);
}
}
?>
但我仍然不必要地通过GetUsers()中的用户不必要地循环。有没有办法循环遍历数组的所有值,其中元素可以从外部删除?
答案 0 :(得分:1)
如果您想检查每个用户是否仍在数据库中,您需要从数据库中查询他的信息,因此比检查数组中的每个项目(如果不是更多的资源支出)需要更多的努力。
但我会建议让用户分成较小的部分,而不是所有用户。并逐个检查。
答案 1 :(得分:1)
首先,您可能需要考虑重写整个业务逻辑。
请勿使用无限循环(while(true)
)和全局变量(global $users
)。
要遍历所有用户,您可以使用generator concept并逐个检索现有用户。因此,在每次迭代期间,您将只从数据库中获得下一个用户:
function getUsersFromDatabase($db)
{
$id = 0;
while (($user = $db->query("SELECT * FROM `users` WHERE `id` > $id LIMIT 1"))) {
yield $user;
$id = $user->id;
}
}
foreach (getUsersFromDatabase($db) as $user) {
checkUser($user);
}
我不知道您的框架或数据库适配器详细信息,因此代码段是通用的,应该被视为伪代码。