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