2012-09-13 43 views
24

Tôi đã có mã sau và semaphore sẽ không khóa nó như mong đợi.php semaphore không hoạt động

(Tôi nhận thức được apc_inc. Đây không phải là những gì tôi đang tìm kiếm.)

$semkey = sem_get(123); 
sem_acquire($semkey); 

$count = apc_fetch('count111'); 
if(!$count) $count = 0; 
$count++; 
apc_store('count111', $count); 

sem_release($semkey); 

Tiếp theo

ab -n 4000 -c 200 http://localhost/test.php

0 yêu cầu thất bại.

nhưng sau đó một apc_fetch('count111') chỉ hiển thị ~ 1200 hits

nginx trên ubuntu 12.04 (64bit), php 5.3.16 ~ dotdeb, php-fpm

  • cập nhật 1: hoạt động hoàn hảo trên Linux bạc hà, 5.4.6 ~ dotdeb, được xây dựng trong máy chủ web. Tôi sẽ thử cùng một máy với cùng phiên bản với nginx.
+2

Chỉ cần làm rõ: Tôi đã cố gắng thực hiện cuộc gọi 'apc_inc' bên trong khối bị khóa và nó đã được thực hiện tất cả 4000 lần. – Alex

+0

Theo như tôi hiểu PHP semaphore là khóa bộ nhớ chia sẻ và tài nguyên, không phải khối mã. Tôi tin rằng nó sẽ làm việc với các chức năng bộ nhớ chia sẻ PHP – Bnaya

+1

Tôi giả định sem_get khởi tạo tất cả các tài nguyên cần thiết và mã nguồn của PHP khá nhiều xác nhận điều đó. Họ đã có một cuộc gọi trực tiếp đến semix của posix, mà sẽ tiếp tục từ đó. Bên cạnh đó, các semaphores là ment để đồng bộ hóa các quá trình ** không ** chia sẻ bất kỳ bộ nhớ nào. – Alex

Trả lời

1

Vấn đề là, rõ ràng, với chính APC, chứ không phải với semaphore.
Cập nhật thành PHP 5.4.8 -1 ~ dotdeb.0 đã giải quyết được sự cố cho cả chạy thử nghiệm máy chủ nginx và tích hợp sẵn.

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