2011-12-25 20 views

Trả lời

31

Bộ nhớ dùng chung cho phép nhiều quy trình truy cập cùng một dữ liệu trong bộ nhớ. Bạn có thể sử dụng nó để chia sẻ dữ liệu giữa việc chạy các tập lệnh PHP.

$shm = shmop_open(0xF00, "c", 0644, 4); 

$count = unpack('L', shmop_read($shm, 0, 4)); 
$count = reset($count); 
var_dump($count); 
echo "count: ", $count++, "<br/>\n"; 
shmop_write($shm, pack('L', $count), 0); 

Khi máy tính khởi động lại, mọi thứ trong bộ nhớ dùng chung bị mất.

Các quy trình khác nhau có thể truy cập cùng một bộ nhớ được chia sẻ cùng lúc, có thể dẫn đến race conditions. Trong ví dụ trên, nếu hai tiến trình đọc bộ nhớ dùng chung trước khi ghi lại, thì số đếm sẽ nhỏ hơn 1 lần. Điều kiện chủng tộc có thể được ngăn chặn bằng cách sử dụng một số mutex, nhưng nằm ngoài phạm vi của Q & A.

Bộ nhớ dùng chung này được sử dụng cho một loại inter-process communication, cụ thể là truyền dữ liệu. Một số người khác có sẵn trong PHP (tùy thuộc vào nền tảng và PHP build) là:

  • Tín hiệu (posix_kill để gửi một tín hiệu, pcntl_signal để thiết lập một xử lý tín hiệu), một loại hạn chế về thông điệp đi qua. Các tín hiệu không đặc biệt hữu ích trong các trang được viết kịch bản, vì mỗi tập lệnh sẽ chạy trong một thời gian rất ngắn.
  • Sockets cho dữ liệu. Ổ cắm có thể sử dụng mạng hoặc có thể là cục bộ.
  • Ống cho dữ liệu. posix_mkfifo được sử dụng để tạo ra named pipes (aka FIFOs), và các chức năng tiêu chuẩn file được sử dụng để đọc và ghi dữ liệu. Các đường ống chưa đặt tên (aka anonymous) có thể được tạo giữa các quy trình cha và con bằng cách sử dụng popen hoặc proc_open. Lưu ý các đường ống chưa đặt tên không thể được tạo giữa các quá trình tùy ý. Lưu ý rằng các đường ống trên một số hệ thống là một chiều: một tay cầm ống có thể được sử dụng để đọc hoặc ghi, nhưng không phải cả hai.
  • Semaphores cho synchronization.
  • Hàng đợi thư cho messaging. Trong PHP, phần mở rộng Semaphore cung cấp cả hàng đợi tin nhắn và một bộ chức năng bộ nhớ dùng chung khác (ví dụ: shm_attach). Nhiều tiện ích mở rộng khác cho các giao thức nhắn tin khác nhau cũng có sẵn, bao gồm SAM, STOMPAMQP. Xem "Other Services" trong hướng dẫn sử dụng PHP, v.v.
  • Mạng stream wrappers cho dữ liệu. Ở cấp độ thấp hơn, đây chỉ là ổ cắm, mặc dù chúng cung cấp một giao diện khác. Chúng cũng dành cho các giao thức mức ứng dụng cụ thể, trong khi các socket thì tổng quát hơn.
  • Network protocol extensions, chẳng hạn như cURL, để nhắn tin & dữ liệu. Giống như trình bao bọc luồng, chúng là các ổ cắm (limitd) trong ngụy trang.
  • Web service extensions, chẳng hạn như SOAPXML-RPC, cho remote procedure calls (RPC). Lưu ý rằng mặc dù đây là các socket dựa trên, chúng cho một loại IPC khác (RPC chứ không phải là dữ liệu).

Mặc dù các ổ cắm (và bất kỳ thứ gì dựa trên chúng, như trình bao bọc dòng) và đường ống có thể được sử dụng để truyền dữ liệu giữa các quy trình, khả năng của chúng với nhiều quy trình bị giới hạn. Ổ cắm chỉ có thể kết nối hai quy trình; để xử lý nhiều hơn hai, nhiều ổ cắm cần phải được mở (đó là nơi mà kiến ​​trúc máy khách-máy chủ thường đi vào nó). Với đường ống, chỉ một quy trình có thể read given data; một khi nó có, dữ liệu đó sẽ không có sẵn cho người đọc khác, mặc dù họ có thể đọc dữ liệu khác (mà sau đó sẽ trở thành không có sẵn cho tất cả nhưng người đọc). Một số quy trình tùy ý có thể mở cùng một vùng bộ nhớ dùng chung.

+0

Có cách nào tốt để làm cho quá trình nhận phản ứng với một thông điệp, để nó trở thành sự kiện được điều khiển? – CMCDragonkai

+0

@outis, Tương đương với Windows là gì? – Pacerier

+0

cách này hoạt động trên nhiều máy chủ nút? –

9

Khi một tiến trình đang chạy yêu cầu bộ nhớ, hệ thống cung cấp một bộ nhớ chỉ có thể truy cập được bằng quy trình được cấp phát. Đôi khi bạn chạy nhiều luồng và muốn chia sẻ dữ liệu giữa chúng.

"dữ liệu chia sẻ" có thể được thực hiện bằng cách:

  • dữ liệu Passing qua ổ cắm/Ống
  • Shared Memory (chủ đề, quy trình)

Kể từ khi thông qua dữ liệu không phải là rất tiện dụng trong một số trường hợp, người ta có thể muốn sử dụng Shared memory.

Các chức năng được đề cập cung cấp chức năng xử lý các phân đoạn bộ nhớ chia sẻ trong PHP.

+0

Vì vậy, về cơ bản nó vô dụng? Tôi có nghĩa là nếu bạn có thể sử dụng các biến toàn cầu cho rằng, không có điểm trong rối tung với những shmop_ * chức năng – Alex

+2

@ Alex: PHP không thực sự có "biến toàn cầu" như thế. Đó là một sự nhầm lẫn trong PHP, vì bạn luôn có các không gian quy trình riêng biệt. - Hãy nghĩ về shmop giống memcache hơn, ngoại trừ việc nó là một tính năng hệ thống POSIX/Unix, nhằm chia sẻ giữa các ứng dụng PHP và C (nếu nó không phải là biểu diễn nhị phân không khớp, không thể tìm thấy bản sao đó). Bạn cũng có thể tưởng tượng nó như một đĩa RAM, trên thực tế shmop thường tạo ra một mục nhập trong bộ nhớ chia sẻ '/ etc/shm/*' – mario

+0

được quản lý bởi hệ điều hành. Họ có cách bảo vệ và kiểm soát dịch vụ hơn so với việc sử dụng giới hạn các biến toàn cầu. Bộ nhớ chia sẻ chủ yếu được sử dụng cho liên lạc-giao tiếp. Nếu bạn không cần điều này một cách rõ ràng, hãy dính vào các biến. – fuzzy

Các vấn đề liên quan