2016-04-15 3 views
2

Вот мой скрипт, который берет 50k записей из CSV и выполняет с ним работу CRUD. К сожалению, в работе есть много проблем.Php - Bulk Customer Creation

CSV поля: msisdn, resellerid, product

Ниже перечислены шаги, выполняемые:

  1. Читать CSV.
  2. Создать таблицу темп.
  3. Выберите 1000 лучших записей и отметьте статус случайной строкой, чтобы заблокировать ее.
  4. Выполнение этих записей, в то время как другой запрос поступает в этот файл, а затем после заблокированного состояния выполняется следующая 1000 партий.
  5. Он считывает заблокированные записи о состоянии и вызывает вызов API. Если вызов положительный, он создает запись учетной записи клиента, иначе продолжите вызов API следующей записи.

Код работает нормально, если мы загрузим CSV записей 1k, 2k, до 7k.

Когда мы загружаем, как 10k и выше, те же записи, которые находятся в заблокированном состоянии, все еще называются дважды трижды и много раз, что приводит к нежелательным вызовам API, которых следует избегать. Иногда, когда вызов API успешно, даже тогда учетная запись клиента не создается.

Таким образом, я настоящим вставляю код, чтобы высококвалифицированные специалисты из PHP и Mysql могли изучить код и предложить их улучшения.

<?php 
/********************************************************************************* 
** The contents of this file are subject to the crm CRM Public License Version 1.0 
* ("License"); You may not use this file except in compliance with the License 
* The Original Code is: crm CRM Open Source 
* The Initial Developer of the Original Code is crm. 
* Portions created by crm are Copyright (C) crm. 
* All Rights Reserved. 
* 
********************************************************************************/ 
ini_set('max_execution_time', 30000); 
set_time_limit(0); 

global $adb, $log; 
require_once('include/utils/utils.php'); 
require_once('include/database/PearDatabase.php'); 
include_once 'includes/main/WebUI.php'; 

$result = $adb->pquery("SELECT bulkcustomerid,billingarea,apilogid FROM crm_bulkcustomer where `statusrecord` = 'inprogress'"); 
$noOfRows = $adb->num_rows($result); 

if (!$noOfRows) { 
    $result = $adb->pquery("SELECT bulkcustomerid,billingarea,apilogid FROM crm_bulkcustomer where `statusrecord` = 'new'"); 
    $noOfRows = $adb->num_rows($result); 
} 
if (!$noOfRows) { 
    // add inner join with crm_crmentity for created date interval day for one day. 
    //$result  = $adb->pquery("SELECT bulkcustomerid,billingarea,apilogid FROM crm_bulkcustomer where `statusrecord` = 'closedwithfailure'"); 
    $result  = $adb->pquery("SELECT bulkcustomerid,billingarea,apilogid FROM crm_bulkcustomer inner join crm_crmentity on 
           crm_bulkcustomer.bulkcustomerid=crm_crmentity.crmid where `statusrecord` = 'closedwithfailure'"); 
    $noOfRows = $adb->num_rows($result); 
    $isClosedWf = TRUE; 
} 
$process_data = 1000; 

$log->debug('TOTAL NUMBEROFCSVS ' . $noOfRows); 

$length  = 9; 
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length); 

if ($noOfRows > 0) { // for number of csv files . 
    for ($i = 0; $i < $noOfRows; $i++) { 
     $bulkcustomerid = $adb->query_result($result, $i, 'bulkcustomerid'); 
     $apilogid  = $adb->query_result($result, $i, 'apilogid'); // update the records for processing 
     $billingarea  = $adb->query_result($result, $i, 'billingarea'); 
     if (!$apilogid) { 
      $apilogid = 0; 
     } 

     $adb->query("UPDATE crm_bulkcustomer SET `statusrecord` = 'inprogress' where `bulkcustomerid` = '$bulkcustomerid'"); 

     if ($isClosedWf) { 
      $log->debug('IN CLOSED WITH FAILURE PART'); 
      //sleep(6800); 
      $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '$randomString' where STATUS = '0' OR STATUS REGEXP '[a-z]' ORDER BY id ASC LIMIT $process_data"); 

      $servicetype = "Prepaid"; 
      $log->debug('CRON TASK - After validating Call Create Customer API for Record ID ' . $bulkcustomerid); 
      $log->debug('select msisdn,package from temp_csv_$bulkcustomerid where status=' . $randomString . ' limit' . $process_data . ' FOR UPDATE'); 
      //$transaction = "START TRANSACTION;"; 
      //$adb->pquery($transaction, array()); 
      $result2 = $adb->query("select msisdn,package from temp_csv_$bulkcustomerid where status='$randomString' limit $process_data"); 
      $noOfRows2 = $adb->num_rows($result2); 

      $log->debug('Total row for this table is:- ' . $noOfRows2); 
      if ($noOfRows2 > 0) { 
       for ($j = 0; $j < $noOfRows2; $j++) { 
        $msisdnnum = $adb->query_result($result2, $j, 'msisdn'); 
        $package = $adb->query_result($result2, $j, 'package'); 
        /***** commented MSISDN 
        $log->debug('CRON TASK - Call Create Customer API for Table ID temp_csv_' . $bulkcustomerid . 'and mobile number is' . $msisdnnum); 
        $log->debug("for IF part BulkCustomer_SearchSim_Action::search_msisdn($msisdnnum,$apilogid)"); 
        $result1 = BulkCustomer_SearchSim_Action::search_msisdn($msisdnnum, $apilogid, $bulkcustomerid); 
        $message = $result1['message']; 
        $code = $result1['code']; 
        if ($code == 0) { 
         $log->debug('MESSAGE IS--for code 0 ' . $message . 'code is--' . $code); 
         $log->debug('Sucess UPDATE crm_bulkcustomer SET statusrecord = closed where bulkcustomerid=' . $bulkcustomerid); 
         ******/ 
         $bulkresult = BulkCustomer_CreateCustomer_Action::Create_Customer($msisdnnum, $bulkcustomerid, $package, $servicetype,$billingarea,$apilogid); 
         $log->debug('CUSTOMER WITH ALL ACCOUNTS CREATED SUCCESSFULLY FOR MOBILENO=' . $msisdnnum . 'and current j value is=' . $j . 'and no of records to parse are' . $noOfRows2); 
         $bulkcode = $bulkresult['code']; 
         $bulkmessage = $bulkresult['message']; 

         if ($bulkcode == '0') { 
          $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '1',remarks='$bulkmessage' where `msisdn` = '$msisdnnum'"); 
         } else { 
          $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '-6',remarks='$bulkmessage' where `msisdn` = '$msisdnnum'"); 
         } 
        /****** search MSISDN } else { 
         $log->debug('MESSAGE IS-- for code -1 ' . $message . 'code is--' . $code); 
         $log->debug('Failure UPDATE temp_csv_' . $bulkcustomerid . 'SET status = Failed where msisdn =' . $msisdnnum); 
         $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '-9',remarks='$message' where `msisdn` = '$msisdnnum'"); 
        } 
        search MSISDN *****/ 
        $log->debug('j value is for loop' . $j); 
       } 
      }else{ 
       $log->debug('No data to parse'); 
       $adb->query("UPDATE `crm_bulkcustomer` SET `statusrecord` = 'closed' where `bulkcustomerid` = '$bulkcustomerid'"); 
      } 

     } else { // for locking the columns with -7 
      $log->debug('IN PROGESS OR NEW PART'); 
      $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '$randomString' where `status` = '0' ORDER BY id ASC LIMIT $process_data"); 
      $servicetype = "prepaid"; 
      $log->debug('CRON TASK - After validating Call Create Customer API for Record ID ' . $bulkcustomerid); 
      $log->debug('select msisdn,package from temp_csv_$bulkcustomerid where status=' . $randomString . ' limit' . $process_data . 'FOR UPDATE'); 
      //$transaction = "START TRANSACTION;"; 
      //$adb->pquery($transaction, array()); 
      $result2 = $adb->query("select msisdn,package from temp_csv_$bulkcustomerid where status='$randomString' limit $process_data"); 
      $noOfRows2 = $adb->num_rows($result2); 
      $log->debug('Total row for this table is:- ' . $noOfRows2); 
      if ($noOfRows2 > 0) { 
       for ($j = 0; $j < $noOfRows2; $j++) { 
        $msisdnnum = $adb->query_result($result2, $j, 'msisdn'); 
        $package = $adb->query_result($result2, $j, 'package'); 
        /***** commented MSISDN 
        $log->debug("ELSE BulkCustomer_SearchSim_Action::search_msisdn($msisdnnum,$apilogid)"); 
        $result1 = BulkCustomer_SearchSim_Action::search_msisdn($msisdnnum, $apilogid, $bulkcustomerid); 
        $message = $result1['message']; 
        $code = $result1['code']; 
        if ($code == 0) { 
         $log->debug('MESSAGE IS--for code 0 ' . $message . 'code is--' . $code); 
         $log->debug('Sucess UPDATE crm_bulkcustomer SET statusrecord = closed where bulkcustomerid=' . $bulkcustomerid); 
         ******/ 
         $bulkresult = BulkCustomer_CreateCustomer_Action::Create_Customer($msisdnnum, $bulkcustomerid, $package, $servicetype,$billingarea,$apilogid); 
         $log->debug('CUSTOMER WITH ALL ACCOUNTS CREATED SUCCESSFULLY FOR MOBILENO=' . $msisdnnum . 'and current j value is=' . $j . 'and no of records to parse are' . $noOfRows2); 
         $bulkcode = $bulkresult['code']; 
         $bulkmessage = $bulkresult['message']; 

         if ($bulkcode == '0') { 
          $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '1',remarks='$bulkmessage' where `msisdn` = '$msisdnnum'"); 
         } else { 
          $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '-6',remarks='$bulkmessage' where `msisdn` = '$msisdnnum'"); 
         } 
        /****** } else { 
         $log->debug('Failure UPDATE temp_csv_' . $bulkcustomerid . 'SET status = Failed where msisdn =' . $msisdnnum); 
         $adb->query("UPDATE temp_csv_$bulkcustomerid SET `status` = '-9',remarks='$message' where `msisdn` = '$msisdnnum'"); 
        } 
        comments ends for MSISDN ****/ 
        $log->debug('j value is for loop' . $j); 
       } 
      }else{ 
       $log->debug('No data to parse inprogress or new part'); 
       $adb->query("UPDATE `crm_bulkcustomer` SET `statusrecord` = 'closedwithfailure' where `bulkcustomerid` = '$bulkcustomerid'"); 
      } 
      //commit 
     } // for else part 
     // close the csv file 
     // get count of sucess and failure. 
     $sucesscount = $adb->pquery("SELECT * FROM temp_csv_$bulkcustomerid where `status` = '1'"); // fetch record for new 
     $noofsucess = $adb->num_rows($sucesscount); 
     $adb->query("UPDATE `crm_bulkcustomer` SET `successcount` = '$noofsucess' where `bulkcustomerid` = '$bulkcustomerid'"); 

     // failure count 
     $failurecount  = $adb->pquery("SELECT * FROM temp_csv_$bulkcustomerid where status!='1'"); // fetch record for fails 
     $nooffailure  = $adb->num_rows($failurecount); 
     $reprocesscount  = $adb->pquery("SELECT * FROM temp_csv_$bulkcustomerid where STATUS = '0' OR STATUS REGEXP '[a-z]'"); 
     // fetch record for fails 
     //$noofreprocesscount = 0; 
     $noofreprocesscount = $adb->num_rows($reprocesscount); 
     $log->debug("UPDATE `crm_bulkcustomer` SET `failurecount` = '$nooffailure' where `bulkcustomerid` = '$bulkcustomerid'"); 
     if ($nooffailure == '0') { 
      $adb->query("UPDATE `crm_bulkcustomer` SET `statusrecord` = 'closed' where `bulkcustomerid` = '$bulkcustomerid'"); 
      $adb->query("UPDATE `crm_bulkcustomer` SET `failurecount` = '' where `bulkcustomerid` = '$bulkcustomerid'"); 
     } elseif ($noofreprocesscount) { 
      // check if it is being closed before all records are executed 
      $adb->query("UPDATE `crm_bulkcustomer` SET `statusrecord` = 'inprogress' where `bulkcustomerid` = '$bulkcustomerid'"); 
     } else { 
      $adb->query("UPDATE `crm_bulkcustomer` SET `failurecount` = '$nooffailure' where `bulkcustomerid` = '$bulkcustomerid'"); 
      $adb->query("UPDATE `crm_bulkcustomer` SET `statusrecord` = 'closedwithfailure' where `bulkcustomerid` = '$bulkcustomerid'"); 

      $filename = "$bulkcustomerid" . "-csv"; 
      $file  = fopen("tempcsv/$filename.csv", "w"); 
      $val  = array(
       'MSISDN', 
       'ResellerID', 
       'Package', 
       'Remarks' 
      ); 
      fputcsv($file, $val, ';', ' '); 
      $csvresult = $adb->query("select msisdn,package,resellerid,remarks from temp_csv_$bulkcustomerid where status!='1' "); 
      $csvrows = $adb->num_rows($csvresult); 
      $log->debug('Total row for this table in CSV PART is:- ' . $csvrows); 
      if ($csvrows > 0) { 
       for ($m = 0; $m < $csvrows; $m++) { 
        $msisdnnum = $adb->query_result($csvresult, $m, 'msisdn'); 
        $package = $adb->query_result($csvresult, $m, 'package'); 
        $resellerid = $adb->query_result($csvresult, $m, 'resellerid'); 
        $remarks = $adb->query_result($csvresult, $m, 'remarks'); 
        $remarks = preg_replace('/\s+/', '--', $remarks); 
        $arrayval = array(
         "$msisdnnum", 
         "$resellerid", 
         "$package", 
         "$remarks" 
        ); 
        fputcsv($file, $arrayval, ';', ' '); 

       } 
      } 
     } 
    } 

} else { 
    $log->debug('No status with NEW or Pending of CSV RECORDS found'); 
} 
?> 
+1

Вы посмотрели функцию MySql [LOAD DATA INFILE] (http://dev.mysql.com/doc/refman/5.7/en/load-data.html)? Через несколько секунд вы сможете прочитать файл CSV 100k. Он всегда был моим другом с данными импорта – PierreDuc

+2

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что этот вопрос принадлежит http://codereview.stackexchange.com/ – RiggsFolly

+0

@pierre, читать сейчас не проблема, но выполнение всей операции crud в проблеме .so, если вы можете просто просмотреть код и поместить свои экспертные предложения, что было бы здорово. – Sam

ответ

0

Одной из причин этого может быть то, что из этих 50K записей, которые у вас есть, может быть, некоторые из записей (после 7К) являются неопределенными и что дает вам эту проблему.

Так что, возможно, попробуйте создать кусок записей и попытайтесь выяснить, какой из блоков дает вам проблему и попытаться выяснить эту запись. Это всего лишь общая идея.