Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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 使用Wordpress cronjob导入多个CSV文件_Php_Mysql_Wordpress_Cron_Background Process - Fatal编程技术网

Php 使用Wordpress cronjob导入多个CSV文件

Php 使用Wordpress cronjob导入多个CSV文件,php,mysql,wordpress,cron,background-process,Php,Mysql,Wordpress,Cron,Background Process,我有一个功能,获取上传的csv文件,并将每1000条记录拆分为一个新文件。 我将文件分为1000个块,因为在使用5000K+csv记录导入大型文件时,脚本会停止,因为我的防火墙和主机不允许超过180秒的脚本 因此,在将大文件拆分为多个文件后,另一个函数开始使用ajax请求将文件逐个导入cutsom datateble,该函数将一直运行,直到文件夹中不再存在任何文件,因为每次成功导入文件后,该文件将从文件夹中删除 现在,当导入表单仍在浏览器中打开时,以下代码可以正常工作。浏览器中的窗口关闭后,进程

我有一个功能,获取上传的csv文件,并将每1000条记录拆分为一个新文件。 我将文件分为1000个块,因为在使用5000K+csv记录导入大型文件时,脚本会停止,因为我的防火墙和主机不允许超过180秒的脚本

因此,在将大文件拆分为多个文件后,另一个函数开始使用ajax请求将文件逐个导入cutsom datateble,该函数将一直运行,直到文件夹中不再存在任何文件,因为每次成功导入文件后,该文件将从文件夹中删除

现在,当导入表单仍在浏览器中打开时,以下代码可以正常工作。浏览器中的窗口关闭后,进程将停止,这是预期的

function maybe_insert_new_subscriber_batch_database_table() {

        global $wpdb;
        $table_subscriber_name = $GLOBALS['table_subscriber_name'];

        $files = glob(WP_PLUGIN_DIR . '/lubuvna-newsletter/import/*.csv');

        if (empty($files)) {
            $callback_database['title'] = __("Import Failed", "translate-newsletter");
            $callback_database['detail'] = __("no files to import", "translate-newsletter");
            $callback_database['status'] = '401';

            echo json_encode($callback_database);
            exit();
        }
        //$files=glob("/path/to/your/folder/*.css");
        //foreach ($files as $file) {

        //}

        // read and open file
        //$csvFile = fopen(get_option(LUBUVNA_PREFIX.'import_file_url'), 'r');
        $csvFile = fopen($files[0], 'r');
        $csvData = fgetcsv($csvFile);
        $totalInserted = 0;
        $totalUpdated = 0;
        $totalFailed = 0;

        while(($csvData = fgetcsv($csvFile)) !== FALSE){
        
            // Get the Row column length
            $dataLen = count($csvData);
            $email = isset($form_data["email"]) ? trim($csvData[$form_data["email"]]) : '';
            $phone = isset($form_data["phone"]) ? trim($csvData[$form_data["phone"]]) : '';

            // Validate Email
            $filterEmail = !filter_var($email, FILTER_VALIDATE_EMAIL) === false;
            
            // Validate Phone number format
            $filterNumber   = preg_replace("/[^0-9]/", "", $phone ); 
            $allAfterFive   = substr($filterNumber, strpos($filterNumber, "5")); 
            $finalPhone       = '0'.$allAfterFive; 
            $phoneCharCount    = strlen($finalPhone);

            // check if email is valid
            if ( $filterEmail OR $phoneCharCount == '10' ) {
                
                if ($phoneCharCount == '10'){
                    $finalPhone = $finalPhone;
                } else {
                    $finalPhone = null;
                }

                if ( $filterEmail ){
                    $finalEmail = $email;
                } else {
                    $finalEmail = null;
                }

                // groups to remove
                if ( !empty($form_data[LUBUVNA_PREFIX.'currenttags']) ) {
                    $valRemoveGroups = $form_data[LUBUVNA_PREFIX.'currenttags'];
                    $repSpaceRem = preg_replace('/\s+/', '_', $valRemoveGroups);
                    $removeFromGroups = strtolower($repSpaceRem);
                    $delGroups = array_fill_keys(explode(",", $removeFromGroups), null);
                    $groupsArrDel = array();
                    foreach ($delGroups as $key => $value){
                        //$group_name  = $key;
                        $groupsArrDel[] = 'gr_'.$key;
                    }

                    $unselectedGroups = array_fill_keys($groupsArrDel, null);

                } else {
                    $unselectedGroups = array();
                }


                // groups teo add
                if ( !empty($form_data[LUBUVNA_PREFIX.'multiliststext']) ) {
                    $addToGroups = $form_data[LUBUVNA_PREFIX.'multiliststext'];
                    $repSpaceAdd = preg_replace('/\s+/', '_', $addToGroups);
                    $addToGroups = strtolower($repSpaceAdd);
                    $addGroups = array_fill_keys(explode(",", $addToGroups), 'yes');
                    $groupsArrAdd = array();
                    foreach ($addGroups as $key => $value){
                        $groupsArrAdd[] = 'gr_'.$key;
                    }

                    $selectedGroups = array_fill_keys($groupsArrAdd, 'yes');

                } else {
                    $selectedGroups = array();
                }


                //final groups values
                if ($form_data[LUBUVNA_PREFIX.'remove_old_groups_value'] == 'enabled' ) {
            
                    $finalGroups = array_merge($selectedGroups, $unselectedGroups);

                } else {

                    $finalGroups = $selectedGroups;

                }

            
                $first_name = isset($form_data["first_name"]) ? trim($csvData[$form_data["first_name"]]) : '';
                $last_name = isset($form_data["last_name"]) ? trim($csvData[$form_data["last_name"]]) : '';
                $email = isset($form_data["email"]) ? $finalEmail : '';
                $phone = isset($form_data["phone"]) ? $finalPhone : '';
                $birthday = isset($form_data["birthday"]) ? trim($csvData[$form_data["birthday"]]) : '';
                $gender = isset($form_data["gender"]) ? trim($csvData[$form_data["gender"]]) : '';
                $customer_type = isset($form_data["customer_type"]) ? trim($csvData[$form_data["customer_type"]]) : '';
                $id_company_number = isset($form_data["id_company_number"]) ? trim($csvData[$form_data["id_company_number"]]) : '';
                $street_address = isset($form_data["street_address"]) ? trim($csvData[$form_data["street_address"]]) : '';
                $address_line_2 = isset($form_data["address_line_2"]) ? trim($csvData[$form_data["address_line_2"]]) : '';
                $city = isset($form_data["city"]) ? trim($csvData[$form_data["city"]]) : '';
                $state_area = isset($form_data["state_area"]) ? trim($csvData[$form_data["state_area"]]) : '';
                $zip = isset($form_data["zip"]) ? trim($csvData[$form_data["zip"]]) : '';
                $country = isset($form_data["country"]) ? trim($csvData[$form_data["country"]]) : '';
                $customer_from = isset($form_data["customer_from"]) ? trim($csvData[$form_data["customer_from"]]) : '';
                $last_visit = isset($form_data["last_visit"]) ? trim($csvData[$form_data["last_visit"]]) : '';
                $send_sms = isset($form_data["send_sms"]) ? trim($csvData[$form_data["send_sms"]]) : '';
                $send_email = isset($form_data["send_email"]) ? trim($csvData[$form_data["send_email"]]) : '';
                $join_date = isset($form_data["join_date"]) ? trim($csvData[$form_data["join_date"]]) : '';
                $post_modified = date('Y-m-d H:i:s', current_time('timestamp'));
                

                // CSV array vallues to save
                $data_first = array(
                    'first_name' => $first_name,
                    'last_name' => $last_name,
                    'email' => $email,
                    'phone' => $phone,
                    'birthday' => $birthday,
                    'gender' => $gender,
                    'customer_type' => $customer_type,
                    'id_company_number' => $id_company_number,
                    'street_address' => $street_address,
                    'address_line_2' => $address_line_2,
                    'city' => $city,
                    'state_area' => $state_area,
                    'zip' => $zip,
                    'country' => $country,
                    'customer_from' => $customer_from,
                    'last_visit' => $last_visit,
                    'send_sms' => $send_sms,
                    'send_email' => $send_email,
                    'join_date' => $join_date,
                    'post_author' => $current_user->ID,
                    'post_modified' => $post_modified
                );
            

                // remove empty key values from the array
                foreach($data_first as $key=>$value) {
                    if(is_null($value) || $value == '')
                        unset($data_first[$key]);
                }

                $data_second = $finalGroups;
                $data = array_merge($data_first, $data_second);

                // check if email exists 
                $where_email= $wpdb->get_results( "SELECT * FROM $table_subscriber_name  WHERE email='".$email."'" );
                $found_email_results = json_encode($where_email);
                $found_email_results_array = json_decode($found_email_results,true);

                // check if phone exists 
                $where_phone = $wpdb->get_results( "SELECT * FROM $table_subscriber_name  WHERE phone='".$phone."'" );
                $found_phone_results = json_encode($where_phone);
                $found_phone_results_array = json_decode($found_phone_results,true);

                
                if (!empty($found_email_results_array) && !empty($found_phone_results_array) OR !empty($found_email_results_array)) { 

                    $where              = array( 'email' => $email );
                    $updated = $wpdb->update( $table_subscriber_name, $data, $where );
                    if($updated){
                        $totalUpdated++;
                    }

                } else if (!empty($found_phone_results_array)) { 

                    $where              = array( 'phone' => $phone );
                    $updated = $wpdb->update( $table_subscriber_name, $data, $where );
                    if($updated){
                        $totalUpdated++;
                    }

                } else {

                    $wpdb->insert( $table_subscriber_name, $data);
                    if($wpdb->insert_id > 0){
                        $totalInserted++;
                    }

                }

            }else if ( filter_var($email, FILTER_VALIDATE_EMAIL) === false && $phoneCharCount !== '10' ) {
                
                // Total failed imports
                $totalFailed++;

            }

        }



        // Display Script End time
        $time_end = microtime(true);

        $time_elapsed_secs = microtime(true) - $start;
        $converted_time = gmdate("H:i:s", $time_elapsed_secs);

        // rmeove the file
        unlink($files[0]); 

        $callback_database['title'] = __("Import successful", "translate-newsletter");
        $callback_database['new'] = $totalInserted;
        $callback_database['updated'] = $totalUpdated;
        $callback_database['failed'] = $totalFailed;
        $callback_database['detail'] = __("contacts has been imported", "translate-newsletter");
        $callback_database['updated_text'] = __("combined or updated", "translate-newsletter");
        $callback_database['failed_text'] = __("Failed", "translate-newsletter");
        $callback_database['inputs'] = $postarr;
        $callback_database['data'] = $data;
        $callback_database['datatest'] = $dataLen;
        $callback_database['status'] = '200';
        $callback_database['execution_time'] = $converted_time ;
        $callback_database['hasMoreFiles'] = count($files) > 1 ;

        echo json_encode($callback_database);
        exit();
    

}
add_action( 'wp_ajax_new_subscriber_batch_database_table', 'maybe_insert_new_subscriber_batch_database_table' );

Ajax调用并检查文件夹中是否还有文件。如果是,请再次调用该函数

window.lubuvna_board_subscriber_batch_add_datatable_send = () => {

        

    //check form validation on form click
    $("#form-new-subscriber-batch-send").on('submit',function(e){
        e.preventDefault();

        var el_form = $('#form-new-subscriber-batch-send'),
        el_form_submit = $('.submit', el_form);

        if (el_form[0].checkValidity() === true) {

            // If form is valid run function
            new_subscriber_batch_database_table()

            // Ajax request.
            function new_subscriber_batch_database_table() {
                $.ajax({
                    url: localized_lubuvna_board_subscriber_batch_database_table_send.admin_ajax_url,
                    type: 'POST',
                    dataType: 'json',
                    data: {
                        action: 'new_subscriber_batch_database_table', 
                        form_data: el_form.serialize()
                    },
                    cache: false
                }).done(function (response) {
                    //alert('clicked');
                    //var jsonobj = jQuery.parseJSON(response);
                    //console.log(jsonobj);
                    console.log(response);
                    if (response.status == '200') {

                        if (response.hasMoreFiles) {
                            // if file found run the script again
                            new_subscriber_batch_database_table()
                        }

                    }else if (response.status == '401') {

                        el_form_submit.closest('.multistep-form').find('.wizard-alert .alert-success-form').hide();
                        el_form_submit.closest('.multistep-form').find('.wizard-alert .alert-warning-form').show();

                    }

                });
            }
            // else if form is invalid
        } else if (el_form[0].checkValidity() === false) {
            event.preventDefault()
            event.stopPropagation()
        }
    });
    
}

我需要用户提交表单,即使窗口关闭,整个过程也应该在后台进行,直到所有文件都导入。我想知道是否有一种方法可以让wordpress cronjob实现这一点,或者有人知道如何实现这一点?我真的被这个卡住了,不知道如何在没有超时问题的情况下在后台运行这个函数

一旦文件被上传到服务器上,我强烈建议只让客户端的东西(AJAX等)对其进行报告,它不应该导致服务器上发生任何进一步的事情(除非用户需要与它交互)。相反,既然你在WordPress中,那就看看他们的网站。上传后,为第一次运行安排任务。完成该任务后,如果还有更多任务,则安排下一个任务,依此类推。您还需要从“穷人的cron”切换到系统控制的cron。