SOAP リクエストから受信したデータをループして、Drupal インストールのカスタム テーブルにレコードを挿入しようとしています。
最初に、カスタム モジュールを作成し、標準mysqli_connect()
構文を使用してデータベースに接続し、レコードをループして挿入しました。これはうまく機能し、リモート データを約 2 秒でフェッチして挿入しましたが、問題はありませんでした。
その後、Drupal にはデータベース API があることを思い出しました (私は Drupal にかなり慣れていないので)、それを正しく行い、代わりに API を使用することにしました。私は自分のコードを API ドキュメントに従って実行する必要があると思う方法に変換しましたが、今ではプロセスに 5 ~ 6 秒かかり、ランダムにハングしてまったく完了せず、奇妙なセッション エラーが発生します。レコードは問題なく挿入されますが、永遠に時間がかかります。
私はそれを間違っているのだろうかと思っています。また、挿入をトランザクションにラップしたいと思います。最初に宛先テーブルのすべてのレコードを削除してから新しいデータを挿入し、最初に削除しているので、ロールバックできるようにしたいのです挿入は何らかの理由で失敗します。
元の 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';