簡體   English   中英

與PHP mysqli_connect()相比,Drupal 7數據庫API非常慢

[英]Drupal 7 database API very slow compared to PHP mysqli_connect()

我試圖遍歷一些來自SOAP請求的數據,並將這些記錄插入Drupal安裝中的自定義表中。

首先,我創建了一個自定義模塊,並使用標准的mysqli_connect()語法連接到數據庫並遍歷記錄並插入它們。 這工作得很好,並且在大約2秒鍾內就順利獲取並插入了我的遠程數據。

然后我想起了Drupal有一個數據庫API(對於Drupal來說我還很陌生),所以我決定正確地使用它,而是改用API。 我將代碼轉換為我認為應該按照API文檔進行操作的方式,但是現在該過程需要5到6秒鍾,有時甚至會掛起,並且根本無法完成,並且會出現奇怪的Session錯誤。 記錄最終可以很好地插入,但是它需要永遠的時間。

我想知道我做錯了嗎。 我還想將插入內容包裝到事務中,因為我首先要先刪除目標表中的所有記錄,然后再插入新數據,並且由於我要先刪除,所以我希望能夠回滾插入由於任何原因而失敗。

我沒有在原始的僅PHP代碼中添加事務代碼,但是嘗試使用Drupal API進行嘗試,盡管完全刪除事務/嘗試/捕獲代碼似乎完全不會影響速度或問題。

無論如何,這是我的原始代碼:

$data = simplexml_load_string($jobsXml);

$connection = mysqli_connect("localhost","user","pass","database");

if (mysqli_connect_errno($connection))
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

// delete * current jobs
mysqli_query($connection,'TRUNCATE TABLE jobs;');

$recordsInserted = 0;

foreach ($data->NewDataSet->Table as $item) {

  //escape and cleanup some fields
  $image = str_replace('http://www.example.com/public/images/job_headers/', '', $item->job_image_file);
  $specialty_description = mysqli_real_escape_string($connection, $item->specialty_description);
  $job_board_title = mysqli_real_escape_string($connection, $item->job_board_title);
  $job_board_subtitle = mysqli_real_escape_string($connection, $item->job_board_subtitle);
  $job_state_code = ($item->job_country_code == 'NZ') ? 'NZ' : $item->job_state_code;

  $sql =  "
  INSERT INTO jobs (
    job_number,
    specialty,
    specialty_description,
    division_code,
    job_type,
    job_type_description,
    job_state_code,
    job_country_code,
    job_location_display,
    job_board_type,
    job_image_file,
    job_board_title,
    job_board_subtitle
  ) VALUES (
    $item->job_number,
    '$item->specialty',
    '$specialty_description',
    '$item->division_code',
    '$item->job_type',
    '$item->job_type_description',
    '$job_state_code',
    '$item->job_country_code',
    '$item->job_location_display',
    '$item->job_board_type',
    '$image',
    '$job_board_title',
    '$job_board_subtitle'
  )
  ";

  if (!mysqli_query($connection,$sql))
  {
    die('Error: ' . mysqli_error($connection) . $sql);
  }
    $recordsInserted++;

}

mysqli_close($connection);
echo $recordsInserted . ' records inserted';

這是我的Drupal代碼。 誰能告訴我是否我做錯了這不是最有效的方法?

$data = simplexml_load_string($jobsXml);

// The transaction opens here.
$txn = db_transaction();  

// delete all current jobs
$records_deleted = db_delete('jobs')
->execute();  

$records_inserted = 0;

try {

  $records = array();

  foreach ($data->NewDataSet->Table as $item) {

    $records[] = array(
      'job_number' =>  $item->job_number,
      'specialty' => $item->specialty,
      'specialty_description' => $item->specialty_description,
      'division_code' => $item->division_code,
      'job_type' => $item->job_type,
      'job_type_description' => $item->job_type_description,
      'job_state_code' => ($item->job_country_code == 'NZ') ? 'NZ' : $item->job_state_code,
      'job_country_code' => $item->job_country_code,
      'job_location_display' => $item->job_location_display,
      'job_board_type' => $item->job_board_type,
      'job_image_file' => str_replace('http://www.example.com/public/images/job_headers/', '', $item->job_image_file),
      'job_board_title' => $item->$job_board_title,
      'job_board_subtitle' => $item->job_board_subtitle,
    );      

    $records_inserted++;

  }

  $fields = array(
    'job_number',
    'specialty',
    'specialty_description',
    'division_code',
    'job_type',
    'job_type_description',
    'job_state_code',
    'job_country_code',
    'job_location_display',
    'job_board_type',
    'job_image_file',
    'job_board_title',
    'job_board_subtitle'
  );

  $query = db_insert('jobs')
    ->fields($fields);
  foreach ($records as $record) {
    $query->values($record);
  }
  $query->execute();

} catch (Exception $e) {
  // Something went wrong somewhere, so roll back now.
  $txn->rollback();

  // Log the exception to watchdog.
  watchdog_exception('Job Import', $e);
  echo $e;
}

echo  $records_deleted . ' records deleted<br>';
echo  $records_inserted . ' records inserted';

您要插入的數據集有多大? 如果數據集很大,那么您可能會遇到查詢大小問題。 嘗試遍歷記錄並像使用PHP一樣逐一插入每條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM