2012-09-13 13 views
24

Ich habe den folgenden Code und das Semaphor würde es nicht wie erwartet sperren.PHP-Semaphor funktioniert nicht

(ich bin mir dessen bewusst apc_inc. Das ist nicht das, was ich suche.)

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

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

sem_release($semkey); 

gefolgt von

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

0 Anfragen fehlgeschlagen.

aber, dass nach einer apc_fetch('count111') zeigt nur ~ 1200 Treffer

nginx auf Ubuntu 12.04 (64 Bit), PHP 5.3.16 ~ Dotdeb, php-fpm

  • Update 1: perfekt auf Werke Linux mint, 5.4.6 ~ dotdeb, eingebauter Webserver. Ich werde die gleiche Maschine mit der gleichen Version mit Nginx versuchen.
+2

Nur um zu verdeutlichen: Ich habe versucht, einen 'apc_inc' Aufruf in den gesperrten Block zu setzen und es wurde 4000 Mal ausgeführt. – Alex

+0

Soweit ich verstehe, blockiert PHP Semaphor Shared Memory und Ressourcen, nicht Code blockieren. Ich glaube, es wird mit den gemeinsamen Shared-Memory-Funktionen arbeiten – Bnaya

+1

Ich nahm an, dass sem_get alle erforderlichen Ressourcen initialisiert und der Quellcode von PHP bestätigt dies ziemlich. Sie haben einen direkten Aufruf zum Posix-Semget, das von dort ausgeht. Semaphore sind außerdem dazu da, Prozesse zu synchronisieren, die ** keinen Speicher teilen. – Alex

Antwort

1

Das Problem war offenbar mit der APC selbst, nicht mit dem Semaphor.
Aktualisierung auf PHP 5.4.8 -1 ~ dotdeb.0 hat das Problem sowohl für nginx- als auch für eingebaute Server-Testläufe gelöst.