Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-异步foreach循环_Php_Asynchronous_Foreach - Fatal编程技术网

PHP-异步foreach循环

PHP-异步foreach循环,php,asynchronous,foreach,Php,Asynchronous,Foreach,我有一个网站正在分离音乐曲目,但要做到这一点,用户应该在订阅中购买信用卡 我的问题是,例如,当一个用户从订阅中剩下2个学分并上载3首曲目时,我的脚本循环浏览这些曲目,发现有有效的学分,并立即启动所有这些学分,并将用户可用的学分移动到负数 我需要异步地通过循环,这样每个音轨都有机会在通过下一个音轨之前扣除所需的积分,并且它认为它仍然有积分 下面是我关于这个问题的完整脚本,我添加了一些注释来解释正在发生的事情: // i first query my db for tracks that are v

我有一个网站正在分离音乐曲目,但要做到这一点,用户应该在订阅中购买信用卡

我的问题是,例如,当一个用户从订阅中剩下2个学分并上载3首曲目时,我的脚本循环浏览这些曲目,发现有有效的学分,并立即启动所有这些学分,并将用户可用的学分移动到负数

我需要异步地通过循环,这样每个音轨都有机会在通过下一个音轨之前扣除所需的积分,并且它认为它仍然有积分

下面是我关于这个问题的完整脚本,我添加了一些注释来解释正在发生的事情:

// 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);