Hướng dẫn dùng semaphore code trong PHP

Tôi cần sử dụng mutexes hoặc semaphores trong PHP, và nó khiến tôi sợ hãi. Để làm rõ, tôi không sợ viết mã không có deadlock đồng bộ hóa đúng cách hay sợ những rủi ro khi lập trình đồng thời, mà là PHP xử lý các trường hợp rìa tốt như thế nào.

Sơ lược về nền tảng: viết giao diện xử lý thẻ tín dụng nằm giữa người dùng và cổng thẻ tín dụng của bên thứ ba. Cần ngăn chặn các yêu cầu trùng lặp và đã có sẵn một hệ thống hoạt động, nhưng nếu người dùng nhấn gửi (w / out JS được bật để tôi không thể tắt nút cho họ) cách nhau mili giây, một điều kiện chạy đua xảy ra khi tập lệnh PHP của tôi không nhận ra rằng một yêu cầu trùng lặp đã được thực hiện. Cần một semaphore / mutex để tôi có thể đảm bảo chỉ có một yêu cầu thành công được thực hiện cho mỗi giao dịch duy nhất.

Tôi đang chạy PHP sau nginx thông qua PHP-FPM với nhiều quy trình trên máy Linux đa lõi. Tôi muốn chắc chắn rằng

  1. semaphores được chia sẻ giữa tất cả các quy trình php-fpm và trên tất cả các lõi (nhân i686).
  2. php-fpm xử lý sự cố quy trình PHP trong khi giữ mutex / semaphore và phát hành nó tương ứng.
  3. php-fpm xử lý hủy bỏ phiên trong khi giữ mutex / semaphore và phát hành nó tương ứng.

Vâng tôi biết. Những câu hỏi rất cơ bản, và sẽ thật ngu ngốc khi nghĩ rằng một giải pháp thích hợp không tồn tại cho bất kỳ phần mềm nào khác. Nhưng đây là PHP, và chắc chắn nó không được xây dựng với sự đồng thời, nó thường xuyên bị lỗi (tùy thuộc vào phần mở rộng bạn đã tải) và ở trong một môi trường dễ bay hơi (PHP-FPM và trên web).

Liên quan đến (1), tôi giả sử nếu PHP đang sử dụng các hàm POSIX thì cả hai điều kiện này đều đúng trên máy SMP i686. Đối với (2), tôi thấy từ việc lướt qua các tài liệu rằng có một tham số quyết định hành vi này (mặc dù tại sao một người lại muốn PHP KHÔNG phát hành mutex là phiên bị giết, tôi không hiểu). Nhưng (3) là mối quan tâm chính của tôi và tôi không biết liệu có an toàn không khi giả định rằng php-fpm xử lý đúng tất cả các trường hợp rìa cho tôi. Tôi (rõ ràng là) không bao giờ muốn gặp bế tắc, nhưng tôi không chắc mình có thể tin tưởng PHP sẽ không bao giờ để mã của tôi ở trạng thái mà nó không thể lấy được mutex vì phiên lấy nó đã bị kết thúc một cách duyên dáng hoặc vô duyên.

Tôi đã cân nhắc sử dụng LOCK TABLESphương pháp tiếp cận MySQL , nhưng thậm chí còn có nhiều nghi ngờ hơn vì trong khi tôi tin tưởng khóa MySQL hơn khóa PHP, tôi lo sợ nếu PHP hủy bỏ một yêu cầu (với * out * bị treo) trong khi giữ khóa phiên MySQL, thì MySQL có thể giữ cho bảng được khóa (đặc biệt là vì tôi có thể dễ dàng hình dung ra mã có thể khiến điều này xảy ra).

Thành thật mà nói, tôi cảm thấy thoải mái nhất với phần mở rộng C rất cơ bản, nơi tôi có thể xem chính xác những gì các cuộc gọi POSIX đang được thực hiện và với những tham số nào để đảm bảo hành vi chính xác mà tôi muốn .. nhưng tôi không mong muốn viết mã đó.

Có ai có bất kỳ phương pháp hay nhất nào liên quan đến đồng thời về PHP mà họ muốn chia sẻ không?

24 hữu ích 3 bình luận 14k xem chia sẻ