I have a problem when execute large transaction in Codeigniter 3.
I create transaction for migrating old data like below:
// Controller
public function migrate_document_get()
{
$this->benchmark->mark('code_start');
$data = $this->Delivery_order_model->read_data_class_from_stock();
foreach ($data as $obj) {
$parameters = $this->Delivery_order_model->read_data_for_do($obj->class_no);
$this->Delivery_order_model->create_data($parameters);
}
$this->benchmark->mark('code_end');
$data['message'] = "Finish migrate document DO";
$data['execution_time'] = round($this->benchmark->elapsed_time('code_start', 'code_end')) . " seconds";
$this->response($data, REST_Controller::HTTP_OK);
}
// Model
function create_data($data)
{
$error = array();
$affected_rows = 0;
$this->mysql->trans_start();
foreach ($data as $row) {
$sql_insert_product = "";
$class_no = $row['class_no'];
$article_vendor = $row['article_vendor'];
$style = $row['style'];
$sku_promo = $row['sku_promo'];
$retail = $row['retail'];
$unique_id = $this->generate_unique_id($class_no, $article_vendor, $style, $sku_promo, $retail);
$sku_no = $class_no . $unique_id . $style . $sku_promo . $retail;
$article_no = $class_no . $style . $sku_promo . $retail;
$res_field = $unique_id . $style . $sku_promo;
$format = array();
$format['dept_no'] = $row['dept_no'];
$format['class_no'] = $class_no;
$format['sku_no'] = $sku_no;
if (!empty($row['ref_no'])) {
$format['ref_no'] = $row['ref_no'];
}
$format['article_vendor'] = $article_vendor;
$format['article_no'] = $article_no;
$format['res_field'] = $res_field;
$format['style'] = $style;
$format['category_no'] = $row['category_no'];
$format['size_no'] = $row['size_no'];
$format['color_no'] = $row['color_no'];
$format['material_no'] = $row['material_no'];
$format['unique_id'] = $unique_id;
$format['sku_promo'] = $sku_promo;
if (!empty($row['exp_promo']) and $row['sku_promo'] != "00") {
$format['exp_promo'] = date('Y-m-d', strtotime(str_replace('/', '-', str_replace("'", "", $row['exp_promo']))));
}
$format['season_code'] = date('ym');
$format['retail'] = $retail;
$format['tag_type'] = $row['tag_type'];
if (!empty($row['image'])) {
$format['image'] = $row['image'];
}
$format['time_create'] = date('Y-m-d H:i:s');
$sql_insert_product = $this->mysql->insert_ignore_string("msr_product", $format);
// Transaction 1 -> INSERT msr_product
$this->mysql->query($sql_insert_product);
$sql_insert_do = "";
$format_doc = "DO" . $class_no . date('Ymd');
$do_id = $this->generate_do_id($format_doc);
$doc_no = $format_doc . $do_id;
$store_no = $row['store_no'];
// INSERT msr_do
$format_insert = array();
$format_insert['do_no'] = $doc_no;
$format_insert['store_no'] = $store_no;
$format_insert['sku_no'] = $sku_no;
$format_insert['do_date1'] = date('Y-m-d', strtotime(date('Ymd')));
$format_insert['do_date2'] = date('Y-m-d', strtotime('60 day', strtotime(date('Ymd'))));
$format_insert['do_status'] = 1;
$format_insert['user_input'] = $row['nik'];
$format_insert['ts_input'] = date('Y-m-d H:i:s');
$format_insert['status_item'] = 0;
$format_insert['qty_store'] = $row['qty'];
$format_update['qty_store'] = "qty_store + " . $row['qty'];
$sql_insert_do = $this->mysql->insert_on_duplicate_update_string("msr_do", $format_insert, $format_update, true, false);
// Transaction 2 -> INSERT msr_do
$this->mysql->query($sql_insert_do);
$affected_rows += $this->mysql->affected_rows();
}
$this->mysql->trans_complete();
if ($this->mysql->trans_status() === FALSE) {
$error = $this->mysql->error();
$error['sql_product'] = $sql_insert_product;
$error['sql_do'] = $sql_insert_do;
}
return $this->commonutil->format_output($affected_rows, $error);
}
When I execute method above in loop,
I facing an issue with error 500 internal server error.
but when I execute method like below one by one, not in the loop it's running normally.
// Controller
public function create_post()
{
$this->benchmark->mark('code_start');
$parameters = $this->post();
if (!empty($parameters)) {
$validate_param = $this->validate_parameter_create($parameters[0]);
if ($validate_param->run() == TRUE) {
$save = $this->Delivery_order_model->create_data($parameters);
if (!empty($save) and $save['total_affected'] > 0) {
$this->benchmark->mark('code_end');
$output['status'] = REST_Controller::HTTP_OK;
$output['error'] = false;
$output['message'] = "Success create delivery order list.";
$output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
$this->response($output, REST_Controller::HTTP_OK);
} else {
$this->benchmark->mark('code_end');
$output['status'] = REST_Controller::HTTP_NOT_MODIFIED;
$output['error'] = true;
$output['error_detail'] = $save['error'];
$output['message'] = "Failed create delivery order list!";
$output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
$this->response($output, REST_Controller::HTTP_NOT_MODIFIED);
}
} else {
$this->benchmark->mark('code_end');
$output['status'] = REST_Controller::HTTP_UNPROCESSABLE_ENTITY;
$output['error'] = true;
$output['error_detail'] = $validate_param->error_array();
$output['message'] = "Required JSON Array! [{.....}]";
$output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
$this->response($output, REST_Controller::HTTP_UNPROCESSABLE_ENTITY);
}
} else {
$this->benchmark->mark('code_end');
$output['status'] = REST_Controller::HTTP_UNPROCESSABLE_ENTITY;
$output['error'] = true;
$output['message'] = "Required parameters!";
$output['execution_time'] = $this->benchmark->elapsed_time('code_start', 'code_end') . " seconds.";
$this->response($output, REST_Controller::HTTP_UNPROCESSABLE_ENTITY);
}
}
// Model
function create_data($data)
{
$error = array();
$affected_rows = 0;
$this->mysql->trans_start();
foreach ($data as $row) {
$sql_insert_product = "";
$class_no = $row['class_no'];
$article_vendor = $row['article_vendor'];
$style = $row['style'];
$sku_promo = $row['sku_promo'];
$retail = $row['retail'];
$unique_id = $this->generate_unique_id($class_no, $article_vendor, $style, $sku_promo, $retail);
$sku_no = $class_no . $unique_id . $style . $sku_promo . $retail;
$article_no = $class_no . $style . $sku_promo . $retail;
$res_field = $unique_id . $style . $sku_promo;
$format = array();
$format['dept_no'] = $row['dept_no'];
$format['class_no'] = $class_no;
$format['sku_no'] = $sku_no;
if (!empty($row['ref_no'])) {
$format['ref_no'] = $row['ref_no'];
}
$format['article_vendor'] = $article_vendor;
$format['article_no'] = $article_no;
$format['res_field'] = $res_field;
$format['style'] = $style;
$format['category_no'] = $row['category_no'];
$format['size_no'] = $row['size_no'];
$format['color_no'] = $row['color_no'];
$format['material_no'] = $row['material_no'];
$format['unique_id'] = $unique_id;
$format['sku_promo'] = $sku_promo;
if (!empty($row['exp_promo']) and $row['sku_promo'] != "00") {
$format['exp_promo'] = date('Y-m-d', strtotime(str_replace('/', '-', str_replace("'", "", $row['exp_promo']))));
}
$format['season_code'] = date('ym');
$format['retail'] = $retail;
$format['tag_type'] = $row['tag_type'];
if (!empty($row['image'])) {
$format['image'] = $row['image'];
}
$format['time_create'] = date('Y-m-d H:i:s');
$sql_insert_product = $this->mysql->insert_ignore_string("msr_product", $format);
// Transaction 1 -> INSERT msr_product
$this->mysql->query($sql_insert_product);
$sql_insert_do = "";
$format_doc = "DO" . $class_no . date('Ymd');
$do_id = $this->generate_do_id($format_doc);
$doc_no = $format_doc . $do_id;
$store_no = $row['store_no'];
// INSERT msr_do
$format_insert = array();
$format_insert['do_no'] = $doc_no;
$format_insert['store_no'] = $store_no;
$format_insert['sku_no'] = $sku_no;
$format_insert['do_date1'] = date('Y-m-d', strtotime(date('Ymd')));
$format_insert['do_date2'] = date('Y-m-d', strtotime('60 day', strtotime(date('Ymd'))));
$format_insert['do_status'] = 1;
$format_insert['user_input'] = $row['nik'];
$format_insert['ts_input'] = date('Y-m-d H:i:s');
$format_insert['status_item'] = 0;
$format_insert['qty_store'] = $row['qty'];
$format_update['qty_store'] = "qty_store + " . $row['qty'];
$sql_insert_do = $this->mysql->insert_on_duplicate_update_string("msr_do", $format_insert, $format_update, true, false);
// Transaction 2 -> INSERT msr_do
$this->mysql->query($sql_insert_do);
$affected_rows += $this->mysql->affected_rows();
}
$this->mysql->trans_complete();
if ($this->mysql->trans_status() === FALSE) {
$error = $this->mysql->error();
$error['sql_product'] = $sql_insert_product;
$error['sql_do'] = $sql_insert_do;
}
return $this->commonutil->format_output($affected_rows, $error);
}
I already resizing on DB temp space
and I already check the method it's running normally
what's wrong with that, please give me some advice.
<?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: </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: </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: </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.
}
?>
I'm facing really serious issue on live server this code works fine 2 days before but now its saying memory exhausted, i tried to increase memory but still not working. Can you please somebody help me.
i have a script to download all pdf file and save it in a library...
im using gmail account.. Imap is enabled;
using centOS 5.11, openssl version: 1.0.1g:
Why sometimes it works.. and why sometimes wont and have a error!
error says
PHP Warning: imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl}INBOX
No such host as imap.gmail.comPHP Notice: Unknown: No such host as imap.gmail.com (errflg=2)
this is the code:
<?php
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'xxxxxx#gmail.com';
$password = 'password';
$savedirpath = "/myLibrary";
$type = 'ReadAttachment';
$obj = new $type;
$obj->getdata($hostname ,$username ,$password,$savedirpath);
class ReadAttachment
{
function getdecodevalue($message,$coding) {
switch($coding) {
case 0:
case 1:
$message = imap_8bit($message);
break;
case 2:
$message = imap_binary($message);
break;
case 3:
case 5:
$message=imap_base64($message);
break;
case 4:
$message = imap_qprint($message);
break;
}
return $message;
}
function getdata($hostname ,$username ,$password,$savedirpath) {
$savedirpath = str_replace('\\', '/', $savedirpath);
if (substr($savedirpath, strlen($savedirpath) - 1) != '/') {
$savedirpath .= '/';
}
$mbox = imap_open ($hostname , $username , $password) or die("can't connect: " . imap_last_error());
$message = array();
$message["attachment"]["type"][0] = "text";
$message["attachment"]["type"][1] = "multipart";
$message["attachment"]["type"][2] = "message";
$message["attachment"]["type"][3] = "application";
$message["attachment"]["type"][4] = "audio";
$message["attachment"]["type"][5] = "image";
$message["attachment"]["type"][6] = "video";
$message["attachment"]["type"][7] = "other";
$MC = imap_check($mbox);
$result = imap_fetch_overview($mbox,"1:{$MC->Nmsgs}",0);
$jk = 1;
foreach ($result as $overview) {
$date= strtotime($overview->date);
$unixDate = date("YmdHis", $date);
$from= $overview->from;
$structure = imap_fetchstructure($mbox, $jk);
$parts = (isset($structure->parts) ? $structure->parts : false);
$fpos=2;
for($i = 1; $i < count($parts); $i++) {
$message["pid"][$i] = ($i);
$part = $parts[$i];
if($part->disposition == "ATTACHMENT") {
$message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
$message["subtype"][$i] = strtolower($part->subtype);
$ext=$part->subtype;
$params = $part->dparameters;
$filename=$part->dparameters[0]->value;
$mege="";
$data="";
$mege = imap_fetchbody($mbox,$jk,$fpos);
$filename="$filename";
$extension=pathinfo($filename);
$file_extension = $extension['extension'];
if($file_extension === "pdf")
{
$new_filename = $filename;
$fp=fopen($savedirpath.$new_filename,'w');
$data=$this->getdecodevalue($mege,$part->type);
fputs($fp,$data);
fclose($fp);
$fpos+=1;
}
}
} imap_delete($mbox,$jk);
$jk++;
}
imap_expunge($mbox);
imap_errors() ;
imap_close($mbox);
}
}
?>
I need help,
for example: the attachment name from my message inbox is sample.pdf,
I have an php script to download the attachment!
now my problem is to rename the attachment from inbox using php
i want to make php script that automatically change the attachment name(sample.pdf) into; ahm let say rename it into the subject of the message... so it become subject.pdf...
<?php $hostname = '{xxxxxxpop3/notls}INBOX';
$username = 'xxx#gmail.com';
$password = 'password';
$savedirpath = "/root/Fax";
$type = 'ReadAttachment';
$obj = new
$type;
$obj->getdata($hostname, $username, $password, $savedirpath, $delete_emails = false);
class ReadAttachment
{
function getdecodevalue ($message, $coding)
{
switch ($coding)
{
case 0:
case 1:
$message = imap_8bit($message);
break;
case 2:
$message = imap_binary($message);
break;
case 3:
case 5:
$message = imap_base64($message);
break;
case 4:
$message = imap_qprint($message);
break;
}
return $message;
}
function getdata ($hostname, $username, $password, $savedirpath, $delete_emails = false)
{
// make sure savepath has trailing slash(/)
$savedirpath = str_replace('\\', '/', $savedirpath);
if (substr($savedirpath, strlen($savedirpath) - 1) != '/')
{
$savedirpath .= '/';
}
$mbox = imap_open($hostname, $username, $password) or die("can't connect: " . imap_last_error());
$message = array();
$message["attachment"]["type"][0] = "text";
$message["attachment"]["type"][1] = "multipart";
$message["attachment"]["type"][2] = "message";
$message["attachment"]["type"][3] = "application";
$message["attachment"]["type"][4] = "audio";
$message["attachment"]["type"][5] = "image";
$message["attachment"]["type"][6] = "video";
$message["attachment"]["type"][7] = "other";
for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++)
{
$structure = imap_fetchstructure($mbox, $jk, FT_UID);
$parts = (isset($structure->parts) ? $structure->parts : false);
$fpos = 2;
for ($i = 1; $i < count($parts); $i++)
{
$message["pid"][$i] = ($i);
$part = $parts[$i];
if ($part->disposition == "ATTACHMENT")
{
$message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
$message["subtype"][$i] = strtolower($part->subtype);
$ext = $part->subtype;
$params = $part->dparameters;
$filename = $part->dparameters[0]->value;
$mege = "";
$data = "";
$mege = imap_fetchbody($mbox, $jk, $fpos);
$filename = "$filename";
$fp = fopen($savedirpath . $filename, 'w');
$data = $this->getdecodevalue($mege, $part->type);
fputs($fp, $data);
fclose($fp);
$fpos += 1;
}
}
if ($delete_emails)
{
// imap_delete tags a message for deletion
imap_delete($mbox, $jk);
}
} // imap_expunge deletes all tagged messages if ($delete_emails) { imap_expunge($mbox); }
imap_close($mbox);
}
}
?>
Well you set the filename here:
$fp = fopen($savedirpath . $filename, 'w');
so you just need to change the $filename to your desired value
Downloading attachment was working... but the delete wasn't?
Can anyone tell me whats wrong and how to make it work?
<?php $hostname = '{xxxxxxpop3/notls}INBOX'; $username = 'xxx#gmail.com'; $password = 'password';
$savedirpath = "/root/Fax"; $type = 'ReadAttachment'; $obj = new $type; $obj->getdata($hostname, $username, $password, $savedirpath, $delete_emails = false);
class ReadAttachment {
function getdecodevalue ($message, $coding)
{
switch ($coding)
{
case 0:
case 1:
$message = imap_8bit($message);
break;
case 2:
$message = imap_binary($message);
break;
case 3:
case 5:
$message = imap_base64($message);
break;
case 4:
$message = imap_qprint($message);
break;
}
return $message;
}
function getdata ($hostname, $username, $password, $savedirpath, $delete_emails = false)
{
// make sure savepath has trailing slash(/)
$savedirpath = str_replace('\\', '/', $savedirpath);
if (substr($savedirpath, strlen($savedirpath) - 1) != '/')
{
$savedirpath .= '/';
}
$mbox = imap_open($hostname, $username, $password) or die("can't connect: " . imap_last_error());
$message = array();
$message["attachment"]["type"][0] = "text";
$message["attachment"]["type"][1] = "multipart";
$message["attachment"]["type"][2] = "message";
$message["attachment"]["type"][3] = "application";
$message["attachment"]["type"][4] = "audio";
$message["attachment"]["type"][5] = "image";
$message["attachment"]["type"][6] = "video";
$message["attachment"]["type"][7] = "other";
for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++)
{
$structure = imap_fetchstructure($mbox, $jk, FT_UID);
$parts = (isset($structure->parts) ? $structure->parts : false);
$fpos = 2;
for ($i = 1; $i < count($parts); $i++)
{
$message["pid"][$i] = ($i);
$part = $parts[$i];
if ($part->disposition == "ATTACHMENT")
{
$message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
$message["subtype"][$i] = strtolower($part->subtype);
$ext = $part->subtype;
$params = $part->dparameters;
$filename = $part->dparameters[0]->value;
$mege = "";
$data = "";
$mege = imap_fetchbody($mbox, $jk, $fpos);
$filename = "$filename";
$fp = fopen($savedirpath . $filename, 'w');
$data = $this->getdecodevalue($mege, $part->type);
fputs($fp, $data);
fclose($fp);
$fpos += 1;
}
}
if ($delete_emails)
{
// imap_delete tags a message for deletion
imap_delete($mbox, $jk);
}
} // imap_expunge deletes all tagged messages if ($delete_emails) { imap_expunge($mbox); }
imap_close($mbox);
} }
?>
add
imap_expunge($jk);
after
imap_delete($mbox, $jk);
if it doesn't work try imap_errors to see whats going on.