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, STOMP và AMQP. 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ư SOAP và XML-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.
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
@outis, Tương đương với Windows là gì? – Pacerier
cách này hoạt động trên nhiều máy chủ nút? –