致命错误:允许的内存大小为134217728 Bytes Exhausted(Drupal + PHPexcel)

时间:2016-08-18 04:16:24

标签: php drupal phpexcel

    <?php
    function import_sales_request(){

    $hostname = '****';
    $username = '****';
    $password = '*****';

    global $base_url;

    $inbox = imap_open($hostname, $username, $password) or die('Cannot connect to Gmail: ' . imap_last_error());
    $emails = imap_search($inbox, 'UNSEEN', SE_UID);
    $emailDates = array();

    if ($emails) {
    //$count = 1;
    rsort($emails);

    foreach ($emails as $email_number) {

    $overview = imap_fetch_overview($inbox, $email_number, FT_UID);
    $message = imap_fetchbody($inbox, $email_number, 2, FT_UID);
    $structure = imap_fetchstructure($inbox, $email_number, FT_UID);


    $emailDates[$email_number] = $overview[0]->date;

    $message_header = imap_fetchheader($inbox, $email_number, 1);
    $message_body = imap_fetchbody($inbox, $email_number, "1.1", FT_UID);

    //file_put_contents(drupal_get_path('module', 'pricecal') . "/mail/" . $email_number . ".htm", nl2br($message_header) . $message_body);

    $attachments = array();
    if (isset($structure->parts) && count($structure->parts)) {
        for ($i = 0; $i < count($structure->parts); $i++) {
            $attachments[$i] = array('is_attachment' => false, 'filename' => '', 'name' => '', 'attachment' => '');
            if ($structure->parts[$i]->ifdparameters) {
                foreach ($structure->parts[$i]->dparameters as $object) {
                    if (strtolower($object->attribute) == 'filename') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['filename'] = $object->value;
                    }
                }
            }
            if ($structure->parts[$i]->ifparameters) {
                foreach ($structure->parts[$i]->parameters as $object) {
                    if (strtolower($object->attribute) == 'name') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['name'] = $object->value;
                    }
                }
            }
            if ($attachments[$i]['is_attachment']) {
                $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i + 1, FT_UID);
                if ($structure->parts[$i]->encoding == 3) {
                    $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                } elseif ($structure->parts[$i]->encoding == 4) {
                    $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                }
            }
        }
    }
    foreach ($attachments as $attachment) {
        if ($attachment['is_attachment'] == 1) {
            $filename = $attachment['name'];
            $fileinfo = pathinfo($filename);
            if (in_array($fileinfo['extension'], array('csv', 'xls', 'xlsx'))) {
                if (empty($filename))
                    $filename = $attachment['filename'];
                if (empty($filename))
                    $filename = time() . ".dat";
                $fp = fopen(drupal_get_path('module', 'pricecal') . "/mail/".$email_number."-".clean($overview[0]->from). "-" . clean($filename), "w+");
                fwrite($fp, $attachment['attachment']);
                fclose($fp);
            }
        }
    }
    //if($count++ >= $max_emails) break;
    imap_setflag_full($inbox, $email_number, "\\Seen \\Flagged", ST_UID);
    }
    }
    imap_close($inbox);
    import_sales_request_into_database($emailDates);
    return true;

    }


    /*
    * Insert new and revised request into database
    */

    function import_sales_request_into_database($emailDates = '', $flag = false) {

    global $user;
    global $base_url;
    include_once(drupal_get_path('module', 'pricecal') . '/excel/Classes/PHPExcel/IOFactory.php');
    $filelist = file_scan_directory(drupal_get_path('module', 'pricecal') . '/mail', '/^.*\.(csv|CSV|xls|XLS|xlsx|XLSX)$/');
    if (!empty($filelist)) {

    foreach ($filelist as $list) {

    $objPHPExcel = PHPExcel_IOFactory::load($list->uri);
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true);

    $resultArray = array();
    $part_no = array();
    $start_part_no = 0;
    $temp = 0;
    $ctoarray = array();

    $transaction = db_transaction(); //start database transaction
    try {
    /*
    * Prepare array structure to insert as a new or revised request
    * $flag = true - it is not importing, it is from home page browse button
    */
    $resultArray['requester_name'] = empty($sheetData[1]['B']) ? '' : $sheetData[1]['B'];
    $resultArray['requester_email'] = empty($sheetData[2]['B']) ? '' : $sheetData[2]['B'];
    $resultArray['request_number'] = empty($sheetData[3]['B']) ? '' : $sheetData[3]['B'];
    $resultArray['customer_name'] = empty($sheetData[4]['B']) ? '' : $sheetData[4]['B'];
    $resultArray['segment'] = empty($sheetData[5]['B']) ? '' : $sheetData[5]['B'];
    $resultArray['dmu_cmr'] = empty($sheetData[6]['B']) ? '' : $sheetData[6]['B'];
    $resultArray['cyborg_no'] = empty($sheetData[7]['B']) ? '' : $sheetData[7]['B'];
    $resultArray['duty_type'] = empty($sheetData[8]['B']) ? '' : $sheetData[8]['B'];
    $resultArray['country_code'] = empty($sheetData[9]['B']) ? '' : $sheetData[9]['B'];
    $resultArray['billing_type'] = empty($sheetData[10]['B']) ? '' : $sheetData[10]['B'];
    $resultArray['tier_1_partner'] = empty($sheetData[11]['B']) ? '' : $sheetData[11]['B'];
    $resultArray['tier_2_partner'] = empty($sheetData[12]['B']) ? '' : $sheetData[12]['B'];
    $resultArray['requested_tp'] = empty($sheetData[13]['B']) ? '' : (float)str_replace(',', '', $sheetData[13]['B']);
    $resultArray['deal_justification'] = empty($sheetData[14]['B']) ? '' : $sheetData[14]['B'];

    $cto_counter = 0 ;
    $ctocounterarray = array();

    if (!empty($sheetData)) {
    foreach ($sheetData as $key => $value) {
        if (!empty($resultArray)) {
            if ($value['B'] == 'Part Number*') {
                $start_part_no = $key;
            }
            if ($start_part_no != 0 && $key > $start_part_no && $value['B'] != '') {
                if (($value['A'] == 'CTO' || $value['A'] == 'Regular') && $temp == 0) {
                    if($value['A'] == 'CTO'){
                        $part_no[] = array($value['B'] => array($value['C'], 'primary-cto'));
                        $cto_counter++;
                        $ctocounterarray[] =  $value['B'];
                    }else{
                        $part_no[] = array($value['B'] => array($value['C'], 'primary'));
                    }
                }
                if ($value['A'] == 'Bundle-Base' && trim($value['B']) != "" && !empty($value['B'])) {
                    $temp = 1;
                    $new_part_number = $value['B'];
                }
                if ($temp) {
                    if($value['A'] == "Bundle-Remove"){
                     $value['C'] = -1 * abs($value['C']);
                    }
                    $part_no[] = array($value['B'] => array($value['C'], $value['A']));

                    $ctoarray[$new_part_number][] = array($value['B'] => array($value['C'], $value['A']));
                }
                if ($value['A'] == 'CTO' && $temp == 1 && in_array($value['B'], $ctocounterarray)) {
                    $temp = 0;
                    $cto_counter--;
                }
            }
            $resultArray['part_no'] = $part_no;


        }
    }
    }

    $continue_flag = true;
    if($cto_counter !== 0){
    $transaction->rollback();
    drupal_set_message(t($list->filename . ' import failed' . PHP_EOL), 'error');
    import_sales_request_logfile($list->filename, 0,$resultArray['requester_email'],$resultArray['requester_name']);
    $continue_flag = false;
    $mail_id = ($flag) ? 0 : strstr($list->filename, '-', true); //split email id

    }

    $newRequest = '';
    $quotationSummary = '';
    $quotationLineItems = array();
    $mail_id = ($flag) ? 0 : strstr($list->filename, '-', true); //split email id
    $date = date("Y-m-d H:i:s"); //insert current date time in database
    $email_date = (isset($emailDates) && isset($emailDates[$mail_id]) && array_key_exists($mail_id, $emailDates)) ? date("Y-m-d H:i:s", strtotime($emailDates[$mail_id])) : $date;



    if (!$flag) {
    $result = db_select('quotation_request', 'qr')->fields('qr', array('email_number'))->condition('email_number', $mail_id, '=')->execute()->fetchAssoc();

    if (!empty($result)) {
        drupal_set_message(t($list->filename . ' already imported.' . PHP_EOL), 'warning');
        //import_sales_request_logfile($list->filename, 2);
        $continue_flag = false;
    }
    }

    $request_type = 'new';
    if ($continue_flag && !empty($resultArray)) {
    $request_number = '';
    if (empty($resultArray['request_number'])) {
        $request_number = import_sales_request_number(); //if the request is new
    } else {
        $revision = '';
        $revise_request_number = array(trim($resultArray['request_number']),trim($resultArray['request_number']).'_R1',trim($resultArray['request_number']).'_R2',trim($resultArray['request_number']).'_R3',trim($resultArray['request_number']).'_R4',trim($resultArray['request_number']).'_R5',trim($resultArray['request_number']).'_R6',trim($resultArray['request_number']).'_R7',trim($resultArray['request_number']).'_R8',trim($resultArray['request_number']).'_R19',trim($resultArray['request_number']).'_R10',trim($resultArray['request_number']).'_R11',trim($resultArray['request_number']).'_R12',trim($resultArray['request_number']).'_R13',trim($resultArray['request_number']).'_R14',trim($resultArray['request_number']).'_R15',trim($resultArray['request_number']).'_R16',trim($resultArray['request_number']).'_R17');


        $result = db_select('quotation_request', 'qr')->fields('qr', array('request_number'))->condition('request_number',$revise_request_number , 'IN')->execute();

        $revision = $result->rowCount();
        if (!empty($revision) && $revision > 0) {
            $request_number = $resultArray['request_number'] . '_R' . $revision;
            $request_type = 'revise';
        } else {
            drupal_set_message(t($list->filename . ' has invalid request number.' . PHP_EOL), 'warning');
            import_sales_request_logfile($list->filename, 3,$resultArray['requester_email'],$resultArray['requester_name']);
            $continue_flag = false;


        }
    }

    /*
     * If all OK then it will create a new or revised request in database
     */
    if ($continue_flag) {
        /*
         * $newRequest - will have inserted request number
         */


        try {
            $newRequest = db_insert('quotation_request')->fields(array('email_number' => $mail_id, 'request_number' => $request_number,'request_type'=>$request_type, 'requester_name' => $resultArray['requester_name'], 'requester_email' => $resultArray['requester_email'], 'customer_name' => $resultArray['customer_name'], 'duty_type' => $resultArray['duty_type'], 'billing_type' => $resultArray['billing_type'], 'segment' => $resultArray['segment'],'request_file' => $list->filename, 'request_date_time' => $email_date, 'dmu_cmr' => $resultArray['dmu_cmr'], 'cyborg_no' => $resultArray['cyborg_no'], 'country_code' => $resultArray['country_code'], 'tier_1_partner' => $resultArray['tier_1_partner'], 'tier_2_partner' => $resultArray['tier_2_partner'], 'requested_tp' => $resultArray['requested_tp'], 'deal_justification' => $resultArray['deal_justification'], 'status' => 'generate quotation', 'created' => $date, 'uid' => $user->uid))->execute();
        } catch (PDOException $e) {
            drupal_set_message(t('Error: %message', array('%message' => $e->getMessage())), 'error');

        }
        if (!empty($newRequest)) {
            try {
                $quotationSummary = db_insert('quotation_summary')->fields(array('quotation_request_id' => $newRequest, 'created' => $date, 'uid' => $user->uid))->execute();


            } catch (PDOException $e) {
                drupal_set_message(t('Error: %message', array('%message' => $e->getMessage())), 'error');
            }

            if (!empty($quotationSummary) && !empty($resultArray['part_no'])) {
                $base_part_no_id = 0;
                foreach ($resultArray['part_no'] as $key => $value) {
                    $part_no = key($value);
                    $quantity = (isset($value[$part_no][0])) ? $value[$part_no][0] : 0;
                    $part_no_behaviour = (isset($value[$part_no][1])) ? $value[$part_no][1] : 'primary';


                    $query = db_select('cost_tape', 'ct')->fields('ct', array('cost_tape_id'))->fields('ctp', array('bmc_price'))->condition('ct.part_number', $part_no);
                    $query->leftJoin('cost_tape_price', 'ctp', 'ct.cost_tape_id=ctp.cost_tape_id');
                    $query->orderBy('ctp.created', 'DESC')->range(0, 1);
                    $resultArrayAssoc = $query->execute()->fetchAll();

                    if (count($resultArrayAssoc) > 0) {
                        foreach ($resultArrayAssoc as $node) {
                            $cost_tape_id = $node->cost_tape_id;
                            $bmc_price = $node->bmc_price;
                            $not_found_part_number = "";
                        }
                    } else {
                        $not_found_part_number = $part_no;
                        $cost_tape_id = null;
                        $bmc_price = 0.0;
                    }

                    if($part_no_behaviour == 'CTO' || $part_no_behaviour == 'primary-cto'){
                        $not_found_part_number = $part_no;
                        $not_found_part_desc = "Server";
                        $cost_tape_id = null;
                    }else{
                        $not_found_part_desc = "";
                    }

                    try {
                        $quotationLineItem = db_insert('quotation_lineitems')->fields(array('quotation_request_id' => $newRequest, 'quotation_summary_id' => $quotationSummary, 'cost_tape_id' => $cost_tape_id, 'not_found_part_no' => $not_found_part_number, 'not_found_desc' => $not_found_part_desc, 'part_behavior' => $part_no_behaviour, 'ref_id' => $base_part_no_id, 'bmc_price' => $bmc_price, 'qty' => $quantity, 'created' => $date, 'uid' => $user->uid))->execute();

                            $quotationLineItems[] = $quotationLineItem;

                        if ($part_no_behaviour == 'Bundle-Base' && isset($quotationLineItem)) {
                            $base_part_no_id = $quotationLineItem;
                           // $quotationLineItems[] = $quotationLineItem;
                            $num_updated = db_update('quotation_lineitems') // Table name no longer needs {}
                                    ->fields(array('ref_id' => $base_part_no_id))
                                    ->condition('quotation_lineitems_id', $base_part_no_id, '=')
                                    ->execute();
                        }
                        if ($part_no_behaviour == 'CTO' && $base_part_no_id != 0) {
                            $base_part_no_id = 0;
                        }



                    } catch (PDOException $e) {
                        drupal_set_message(t('Error: %message', array('%message' => $e->getMessage())), 'error');
                    }
                }
            }
        }
    }
    }

    if ($continue_flag && $newRequest && $quotationSummary && !empty($quotationLineItems)) {
    drupal_set_message(t($list->filename . ' imported successfully' . PHP_EOL));
    import_sales_request_logfile($list->filename, 1);

    $requester_name = $resultArray['requester_name'];
    $requester_email_id = $resultArray['requester_email'];

    $params = array(
        'subject' => "Price quote request has been received successfully. Customer Name :- ".$resultArray['customer_name']. " Request No :- ".$request_number,
        'body' => "<p>Hi ".$requester_name.",<br/></p>
                <p>Thanks for your email. DCG Pricing team will work on your price quote request and will shortly share the quotation with you.</p>
                <p>Your request number is ".$request_number.".</p>
                <p>Customer Name : ".$resultArray['customer_name'].".</p>
                <p>
            <strong>Attachment:&nbsp;</strong><a href='" . $base_url . "/sites/all/modules/pricecal/tmp/" . $list->filename . "'>Click here</a><br/>
    </p>
                <p>The dcgpricing@lenovo.com mailbox is dedicated to handle only price quote requests. For any other queries, please reach out to respective pricers.</p>
                <p>*** This is a system generated email, please do not reply to this email ***</p>
                <p>Thanks,<p/><p>DCG Pricing Team</p>",
    );
    drupal_mail('pricecal', 'success_sales_request', $resultArray['requester_email'], language_default(), $params);

    $customer_name = $resultArray['customer_name'];

    $params = array(
        'subject' => "New price quote request received",
        'body' => "<p>Hi Team,<br/></p>
                <p>The DCG pricing tool has successfully uploaded a price quote input request and is now available for your working.</p>
                <ul>
                <li>Request Number : ".$request_number."</li>
                <li>Customer name : ".$customer_name."</li>
                <li>Requestor name : ".$requester_name."</li>
                <li>Requestor email id : ".$requester_email_id."</li>
                <li>Deal justification : ".$resultArray['deal_justification']."</li>
                </ul>
                <p>
            <strong>Attachment:&nbsp;</strong><a href='" . $base_url . "/sites/all/modules/pricecal/tmp/" . $list->filename . "'>Click here</a><br/>
    </p>

                <p>*** This is a system generated email, please do not reply to this email ***</p>
                <p>Thanks,<p/><p>DCG Pricing Team</p>",
    );


    //drupal_mail('pricecal', 'import_success_email', 'chintan.p@blueoceanmi.com', language_default(), $params);

    } else if ($continue_flag) {
    $transaction->rollback();
    //drupal_set_message(t($list->filename . ' import failed' . PHP_EOL), 'error');
    import_sales_request_logfile($list->filename, 0, $resultArray['requester_email'],$resultArray['requester_name']);
    }
    } catch (Exception $e) {
    $transaction->rollback();
    drupal_set_message(t($list->filename . ' import failed' . PHP_EOL), 'error');
    import_sales_request_logfile($list->filename, 0, $resultArray['requester_email'],$resultArray['requester_name']);

    }
    rename($list->uri, drupal_get_path('module', 'pricecal') . '/tmp/' . $list->filename);
    }
    } else {
    drupal_set_message(t('No email founds.' . PHP_EOL), 'warning'); //if no email found with unread status
    }
    return true;
    }

    /*
    * Create new request number and check weather request number already exists
    */

    function import_sales_request_number($length = 6) {
    $selectPartId = db_query("select count(request_number) as request_number from quotation_request")->fetchAssoc();

    if(empty($selectPartId['request_number'])){
    $token = 101;
    }else{
    $token = $selectPartId['request_number'] + 101;
    }
    return $token;
    }


    function import_sales_request_logfile($filename = '', $update = 0,$requester_emailId = '',$requesterName = '') {
    global $base_url;
    $log_file_path = drupal_get_path('module', 'pricecal') . '/logs/' . date('Y-M-d') . '.dat';

    $msg = ($update) ? $filename . ' imported success' . PHP_EOL : $filename . ' import failed' . PHP_EOL;

    if ($update == 0) {
    $msg = $filename . ' import failed' . PHP_EOL;
    } else if ($update == 1) {
    $msg = $filename . ' imported success' . PHP_EOL;
    } else if ($update == 2) {
    $msg = $filename . ' already imported' . PHP_EOL;
    } else if ($update == 3) {
    $msg = $filename . ' invalid request number' . PHP_EOL;
    }

    file_put_contents($log_file_path, date('h:i:sa ') . $msg, FILE_APPEND | LOCK_EX);

    if(empty($requesterName)){
    $requesterName =  "Team";
    }

    if (in_array($update, array(0, 2, 3))) {
    $mail_id = strstr($filename, '-', true);
    $params = array(
    'subject' => $msg,
    'body' => "<p>Hi ".$requesterName.",<br/></p>
    <p>The DCG pricing tool has failed to upload a price quote input request(attached here) . Request you to please review and correct the template.
    </p>
    <p>
            <strong>Attachment:&nbsp;</strong><a href='" . $base_url . "/sites/all/modules/pricecal/tmp/" . $filename . "'>Click here</a><br/>
    </p>
    <p>*** This is a system generated email, please do not reply to this email ***</p>
    <p>Thanks,<br/>DCG Pricing Team</p>",
    );

    if(!empty($requester_emailId)){
    //drupal_mail('pricecal', 'import_success_email', 'chintan.p@blueoceanmi.com,'.$requester_emailId, language_default(), $params);    

    }else{
    // drupal_mail('pricecal', 'import_success_email', 'chintan.p@blueoceanmi.com', language_default(), $params);

    }

    }
    }


    function clean($string) {
    $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.

    return preg_replace('/[^A-Za-z0-9\-@.]/', '', $string); // Removes special chars.
    }
    ?>

我在实时服务器上遇到非常严重的问题这个代码在2天之前工作正常,但现在它说内存耗尽,我试图增加内存但仍然无法正常工作。你能不能请别人帮助我。

0 个答案:

没有答案