PHP-异步foreach循环
我有一个网站正在分离音乐曲目,但要做到这一点,用户应该在订阅中购买信用卡 我的问题是,例如,当一个用户从订阅中剩下2个学分并上载3首曲目时,我的脚本循环浏览这些曲目,发现有有效的学分,并立即启动所有这些学分,并将用户可用的学分移动到负数 我需要异步地通过循环,这样每个音轨都有机会在通过下一个音轨之前扣除所需的积分,并且它认为它仍然有积分 下面是我关于这个问题的完整脚本,我添加了一些注释来解释正在发生的事情:PHP-异步foreach循环,php,asynchronous,foreach,Php,Asynchronous,Foreach,我有一个网站正在分离音乐曲目,但要做到这一点,用户应该在订阅中购买信用卡 我的问题是,例如,当一个用户从订阅中剩下2个学分并上载3首曲目时,我的脚本循环浏览这些曲目,发现有有效的学分,并立即启动所有这些学分,并将用户可用的学分移动到负数 我需要异步地通过循环,这样每个音轨都有机会在通过下一个音轨之前扣除所需的积分,并且它认为它仍然有积分 下面是我关于这个问题的完整脚本,我添加了一些注释来解释正在发生的事情: // i first query my db for tracks that are v
// i first query my db for tracks that are valid and loop through them
$status = 'validated';
$stmt = $conn->prepare("SELECT * FROM demixer.tracks WHERE status=:status");
$stmt->bindParam(':status', $status);
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $row){
$track_id = $row['id'];
echo $track_id.' '.$status.'<br>';
$account_id = $row['account_id'];
$length = $row['length'];
$separation_type = $row['separation_type'];
$separation_algorithm = $row['separation_algorithm'];
$upload_id = $row['upload_id'];
$timings = unserialize($row['timings']);
$length_in_minutes = $length/60;
if($separation_type == 'trial' || $separation_type == 'preview'){
// if the track is a trial i don't have an issue because it doesn't take any credits
}else{
$sub_array = [];
$valid_sub_array = [];
$now = date("Y-m-d H:i:s");
// i get an array of valid subscriptions
$stmt = $conn->prepare("SELECT * FROM demixer.subscriptions WHERE account_id=:account_id AND date_expires>:now");
$stmt->bindParam(':account_id', $account_id);
$stmt->bindParam(':now', $now);
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $key=>$row){
$sub_array[$key] = $row;
}
//if its empty i don't have an issue
if(!empty($sub_array)){
$i = 0;
foreach($sub_array as $row){
$subscription_id = $row['id'];
$no_songs = $row['no_songs'];
$no_minutes = $row['no_minutes'];
$date_expires = $row['date_expires'];
//each subscription has credits for X amount of songs (no_songs) and up to Y length in minutes (no_minutes), when a credit from a subscription is used it is added to the 'subscriptions_used' table in my db, this is the part that needs to be done before looping through to the next track otherwise the credits have not been taken away yet
$stmt = $conn->prepare("SELECT COUNT(*) FROM demixer.subscriptions_used WHERE subscription_id=:subscription_id");
$stmt->bindParam(':subscription_id', $subscription_id);
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $row){
$no_used = $row['COUNT(*)'];
}
if($no_songs>$no_used){
if($length_in_minutes<$no_minutes){
echo 'this subscription has credits<br />';
$valid_sub_array[$i]['sub_id'] = $subscription_id;
$valid_sub_array[$i]['no_minutes'] = $no_minutes;
$valid_sub_array[$i]['date_expires'] = $date_expires;
$i++;
}else{
$message = 'Demixer only supports tracks up to 10 minutes (600 seconds), please try again with a shorter track';
$status = 'error';
$stmt = $conn->prepare("UPDATE demixer.tracks SET status=:status, message=:message WHERE id=:track_id");
$stmt->bindParam(':status', $status);
$stmt->bindParam(':message', $message);
$stmt->bindParam(':track_id', $track_id);
$stmt->execute();
}
}else{
$message = 'You need to buy more credits';
$status = 'error';
$stmt = $conn->prepare("UPDATE demixer.tracks SET status=:status, message=:message WHERE id=:track_id");
$stmt->bindParam(':status', $status);
$stmt->bindParam(':message', $message);
$stmt->bindParam(':track_id', $track_id);
$stmt->execute();
}
}
}else{
$message = 'You need to buy more credits';
$status = 'error';
$stmt = $conn->prepare("UPDATE demixer.tracks SET status=:status, message=:message WHERE id=:track_id");
$stmt->bindParam(':status', $status);
$stmt->bindParam(':message', $message);
$stmt->bindParam(':track_id', $track_id);
$stmt->execute();
}
array_multisort(array_column($valid_sub_array, 'no_minutes'), SORT_ASC, array_column($valid_sub_array, 'date_expires'), SORT_ASC, $valid_sub_array);
var_dump($valid_sub_array);
if(!empty($valid_sub_array)){
$subscription_to_use = $valid_sub_array[0]['sub_id'];
$stmt = $conn->prepare("INSERT INTO demixer.subscriptions_used (track_id, subscription_id) VALUES (:track_id, :subscription_id)");
$stmt->bindParam(':track_id', $track_id);
$stmt->bindParam(':subscription_id', $subscription_id);
$stmt->execute();
echo 'start full<br />';
$data = array(
'separationAlgorithm' => $separation_algorithm,
'uploadId' => $upload_id,
'outputFormats' => array('mp3')
);
$payload = json_encode($data);
$request = curl_init($api_url.'separation/start');
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $payload);
curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type:application/json','Authorization:'.$token));
curl_setopt($request, CURLOPT_CUSTOMREQUEST, "PUT");
$response = curl_exec($request);
$errors = curl_error($request);
$httpcode = curl_getinfo($request, CURLINFO_HTTP_CODE);
curl_close($request);
if(!empty($errors)){
echo $httpcode.' '.$errors;
}else{
echo $httpcode.' '.$response;
}
echo '<br />';
$decoded_response = (array)json_decode($response);
$separation_id = $decoded_response['separationId'];
$start_separation = date(DATE_RFC822);
$timings['start_separation'] = $start_separation;
$timings = serialize($timings);
$status = 'processing';
$stmt = $conn->prepare("UPDATE demixer.tracks SET status=:status, separation_id=:separation_id, timings=:timings WHERE id=:track_id");
$stmt->bindParam(':status', $status);
$stmt->bindParam(':separation_id', $separation_id);
$stmt->bindParam(':timings', $timings);
$stmt->bindParam(':track_id', $track_id);
$stmt->execute();
}
}
}
//我首先查询我的数据库中是否有有效的曲目,然后循环播放
$status='validated';
$stmt=$conn->prepare(“从demixer.tracks中选择*,其中status=:status”);
$stmt->bindParam(':status',$status);
$stmt->execute();
$result=$stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll()作为$row){
$track_id=$row['id'];
echo$track_id.'.$status.'
';
$account_id=$row['account_id'];
$length=$row['length'];
$separation_type=$row['separation_type'];
$separation_algorithm=$row['separation_algorithm'];
$upload_id=$row['upload_id'];
$timings=取消序列化($row['timings']);
$length_in_minutes=$length/60;
如果($separation_type=='trial'|$$separation_type=='preview'){
//如果这条赛道是试用赛,我没有问题,因为它不需要任何学分
}否则{
$sub_数组=[];
$valid_sub_array=[];
$now=日期(“Y-m-d H:i:s”);
//我得到一个有效订阅的数组
$stmt=$conn->prepare(“从demixer.subscriptions中选择*,其中account\u id=:account\u id AND date\u expires>:now”);
$stmt->bindParam(':account\u id',$account\u id);
$stmt->bindParam(':now',$now);
$stmt->execute();
$result=$stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll()作为$key=>$row){
$sub_数组[$key]=$row;
}
//如果它是空的,我没有问题
如果(!空($sub_数组)){
$i=0;
foreach($sub_数组作为$row){
$subscription_id=$row['id'];
$no_songs=$row['no_songs'];
$no_minutes=$row['no_minutes'];
$date_expires=$row['date_expires'];
//每个订阅都有X首歌曲(无歌曲)的积分,长度最多为Y,单位为分钟(无分钟),当使用订阅的积分时,它会添加到my db中的“subscriptions\u used”表中,这是在循环到下一首曲目之前需要完成的部分,否则积分尚未被删除
$stmt=$conn->prepare(“选择demixer.subscriptions中的计数(*),其中subscription\u id=:subscription\u id”);
$stmt->bindParam(':subscription\u id',$subscription\u id);
$stmt->execute();
$result=$stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll()作为$row){
$no_used=$row['COUNT(*)'];
}
如果($no_歌曲>$no_使用){
如果($length_in_minutesprepare(“UPDATE demixer.tracks SET status=:status,message=:message WHERE id=:track_id”);
$stmt->bindParam(':status',$status);
$stmt->bindParam(':message',$message);
$stmt->bindParam(':track\u id',$track\u id);
$stmt->execute();
}
}否则{
$message='您需要购买更多信用卡';
$status='error';
$stmt=$conn->prepare(“更新demixer.tracks SET status=:status,message=:message WHERE id=:track_id”);
$stmt->bindParam(':status',$status);
$stmt->bindParam(':message',$message);
$stmt->bindParam(':track\u id',$track\u id);
$stmt->execute();
}
}
}否则{
$message='您需要购买更多信用卡';
$status='error';
$stmt=$conn->prepare(“更新demixer.tracks SET status=:status,message=:message WHERE id=:track_id”);
$stmt->bindParam(':status',$status);
$stmt->bindParam(':message',$message);
$stmt->bindParam(':track\u id',$track\u id);
$stmt->execute();
}
数组\u多排序(数组\u列($valid\u sub\u数组,'no\u minutes')、排序\u ASC、数组\u列($valid\u sub\u数组,'date\u expires')、排序\u ASC,$valid\u sub\u数组);
变量转储($valid\u sub\u array);
if(!empty($valid\u sub\u array)){
$subscription_to_use=$valid_sub_数组[0]['sub_id'];
$stmt=$conn->prepare(“插入demixer.subscriptions\u used(track\u id,subscription\u id)值(:track\u id,:subscription\u id)”);
$stmt->bindParam(':track\u id',$track\u id);
$stmt->bindParam(':subscription\u id',$subscription\u id);
$stmt->execute();
回显“完全启动
”;
$data=数组(
“separationAlgorithm”=>$separation\u算法,
'uploadId'=>$upload\u id,
'outputFormats'=>数组('mp3')
);
$payload=json_encode($data);
$request=curl_init($api_url.'separation/start');
curl_setopt($request,CURLOPT_RETURNTRANSFER,true);
curl_setopt($request,CURLOPT_POSTFIELDS,$payload);
curl_setopt($request,CURLOPT_HTTPHEADER,array('Content-Type:application/json','Authorization:'.$token));
curl_setopt($request,CURLOPT_CUSTOMREQUEST,“PUT”);
$response=curl\u exec($request);