Nói một cách tổng quát, mục đích của Bảng Semaphore Drupal DB là gì


9

Tôi hiểu mục đích của một ngữ nghĩa trong lập trình IPC nhưng tôi không tìm thấy một lời giải thích tốt - hay bất kỳ - nào về mục đích của bảng này.

Câu trả lời:


11

Bảng semaphore được sử dụng từ cơ chế khóa được triển khai theo mặc định từ Drupal. Nó không khác với cơ chế khóa thông thường được thấy trong lập trình: Một giá trị được sử dụng để xác minh một hoạt động đang được tiến hành, để tránh xung đột hoặc điều kiện cuộc đua. Sự khác biệt là, thông thường, khóa là một tệp, trong khi Drupal sử dụng hàng trong cơ sở dữ liệu.

Trong thực tế, cơ chế khóa có các chức năng để có được khóa ( lock_acquire()) hoặc đợi khóa được giải phóng ( lock_wait()). Trong cả hai trường hợp, cơ sở dữ liệu semaphore được sử dụng.

// lock_acquire()
// Optimistically try to acquire the lock, then retry once if it fails.
// The first time through the loop cannot be a retry.
$retry = FALSE;
// We always want to do this code at least once.
do {
  try {
    db_insert('semaphore')
      ->fields(array(
        'name' => $name,
        'value' => _lock_id(),
        'expire' => $expire,
      ))
      ->execute();
    // We track all acquired locks in the global variable.
    $locks[$name] = TRUE;
    // We never need to try again.
    $retry = FALSE;
  }
  catch (PDOException $e) {
    // Suppress the error. If this is our first pass through the loop,
    // then $retry is FALSE. In this case, the insert must have failed
    // meaning some other request acquired the lock but did not release it.
    // We decide whether to retry by checking lock_may_be_available()
    // Since this will break the lock in case it is expired.
    $retry = $retry ? FALSE : lock_may_be_available($name);
  }
  //lock_may_be_available()
  $lock = db_query('SELECT expire, value FROM {semaphore} WHERE name = :name', array(':name' => $name))->fetchAssoc();
  if (!$lock) {
    return TRUE;
  }
  $expire = (float) $lock['expire'];
  $now = microtime(TRUE);
  if ($now > $expire) {
    // We check two conditions to prevent a race condition where another
    // request acquired the lock and set a new expire time. We add a small
    // number to $expire to avoid errors with float to string conversion.
    return (bool) db_delete('semaphore')
      ->condition('name', $name)
      ->condition('value', $lock['value'])
      ->condition('expire', 0.0001 + $expire, '<=')
      ->execute();
  }
  return FALSE;

Trong Drupal, những người dùng khác nhau có thể yêu cầu cùng một trang, điều đó có nghĩa là các luồng hoặc quy trình khác nhau có thể thực thi cùng một mã cùng một lúc. Điều này có thể gây ra vấn đề khi mã, ví dụ, cập nhật bảng cơ sở dữ liệu. Sử dụng khóa là một cách để tránh điều này có thể gây ra vấn đề.

Lý do một bảng cơ sở dữ liệu được sử dụng đơn giản là Drupal yêu cầu một công cụ cơ sở dữ liệu để làm việc; sử dụng bảng cơ sở dữ liệu cũng cho cơ chế khóa là một cách để giảm các yêu cầu. Cơ chế khóa cũng có thể được thực hiện bằng cách sử dụng tiện ích mở rộng APCu và nếu tôi nhớ lại chính xác, có một mô-đun thực hiện điều đó.


Câu trả lời tuyệt vời. Nhưng để rõ ràng, bảng semaphore tách biệt với các cơ chế khóa riêng trong công cụ DB, nó tự (ví dụ: mysql).
Mike

2
Bảng semaphore được tạo và sử dụng bởi Drupal. Nó không được sử dụng từ công cụ cơ sở dữ liệu.
kiamlaluno

6

Câu trả lời từ @kiamlaluno là đầy đủ và hoàn hảo. Nhưng, tôi nghĩ rằng nó tập trung vào việc giải thích (một cách xuất sắc) khái niệm / việc sử dụng khóa db bằng cách sử dụng các ngữ nghĩa của drupal.

Tôi sẽ lần lượt mạo hiểm đến gần hơn với OP:

Mục đích của bảng semaphore là (như được mô tả trong mô tả tạo bảng semaphore):

Bảng để giữ semaphores, khóa, cờ, v.v. không thể được lưu trữ dưới dạng các biến Drupal vì chúng không được lưu trữ.

Vì vậy, mục đích của bảng đó không chỉ là các cơ chế khóa db (cho đến nay tôi có thể hiểu từ nhận xét đó) và nó cũng giải quyết yêu cầu kỹ thuật để tránh lưu trữ các biến.

NB: Sẽ rất vui khi được sửa chữa bởi một người có chuyên môn hơn về chủ đề này nếu tôi mắc lỗi này. Chúc mừng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.