PHP.mk документација

sem_acquire

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.sem-acquire.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.sem-acquire.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
sem_acquire

Референца за `function.sem-acquire.php` со подобрена типографија и навигација.

function.sem-acquire.php

sem_acquire

(PHP 4, PHP 5, PHP 7, PHP 8)

sem_acquireЗеми семафор

= NULL

sem_acquire(SysvSemaphore $semaphore, bool $non_blocking = false): bool

sem_acquire() по дифолт блокира (ако е потребно) додека семафорот не може да се стекне. Процес што се обидува да стекне семафор што веќе го стекнал ќе блокира засекогаш ако стекнувањето на семафорот го надмине неговиот максимален број семафори.

По обработката на барањето, сите семафори стекнати од процесот, но не експлицитно ослободени, ќе бидат автоматски ослободени и ќе се генерира предупредување.

Параметри

semaphore
semaphore е семафор добиен од sem_get().
non_blocking
Го специфицира дали процесот не треба да чека семафорот да се стекне. Ако е поставено на true, повикот ќе се врати false веднаш ако семафорот не може веднаш да се стекне.

Вратени вредности

Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.

Дневник на промени

Верзија = NULL
8.0.0 semaphore беше вратено при неуспех. SysvSemaphore инстанца сега; претходно, а resource се очекуваше.

Види Исто така

Белешки од корисници 3 белешки

gladd at trash dot eris dot qinetiq dot com
21 години пред
Just to clarify what is meant by "process" above:

On the Apache webserver, many PHP requests will be executed within the same process space because it is multithreaded. However, any semaphores got and acquired by a script and not released and removed will still be automatically cleaned up by the PHP interpreter each time the script terminates.

Remove any trash before emailing!
Pinky
пред 14 години
sem_acquire() is blocking, meaning that subsequent calls with the same semaphore will block indefinitely until the semaphore is released. This ensures serialization, but it is not very practical if all you want to do is check if you should proceed or not. Unfortunately, PHP does not yet support any method of querying the state of a semaphore in a non-blocking manner.

It may seem possible to put together such a mechanism by hand, using shared memory (shm_ functions). However, be warned that it is not trivial and ultimately non-productive. You cannot, for example, simply pick a shared mem var, store the semaphore key and query it. Such an operation would be non-transactional and non-atomic ie. it is possible for two or more parallel processes to manage to read "not locked" from the shared mem var before one of them manages to mark it "locked". You would have to use a (blocking) semaphore to serialize access to the shared mem var, thus recreating the very problem you are trying to solve.

In other words, if non-blocking queries are crucial to you, you need to either request that this issue be solved by the PHP designers, or pick another mechanism to do your locking, one that already has this feature.
Sander Backus
12 години пред
Note that when you reset $sem_identifier the semaphore won't block anymore!

This code does NOT work: 
    $key     = ftok(__FILE__,'m');
    $a        = sem_get($key);
    sem_acquire($a);
    $a = false;

while this one does: 

    $key     = ftok(__FILE__,'m');
    $a        = sem_get($key);
    sem_acquire($a);
    //$a = false;

So: use unique var names for your identifier!
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.