Files

5.1 KiB
Executable File

posix_semaphores - POSIX semaphores extension for PHP

Introduction

This a thin wrapper around POSIX semaphores API. There is built-in PHP extension for semaphores and other IPC, but it supports only System V semaphores, when POSIX version has much more convenient API.

Also System V semaphore support in PHP does not match exactly with C API (in fact it constructs three semaphores in set under the hood and uses them for initialization and other bookkeeping tasks). That's very convenient when one uses semaphores solely from PHP code, but prevents some mixed use cases when one wants to sync PHP code and other code with semaphores.

For example it's not possible to create locked semaphore in C++ application, wait for it in PHP (with locking of course) and then unlock in C++ application (this case could be used for shared memory IPC syncronization, for instance).

So the goal here is to make C API wrapper as thin as possible to allow simultaneous usage of semaphores in applications written in PHP or other programming languages.

Installation

Make sure you have php-devel package installed in your system. You need to be able to build PHP extensions.

After that run commands:

phpize
./configure --enable-posix_semaphores
make

If everything goes well, you will have file ./modules/posix_semaphores.so. The last step is to include this file into your php.ini. Add line extension=/<PATH>/posix_semaphores.so (replace <PATH> with actual path to this extension) and you're done. Don't forget to restart php-fpm or apache if you're using PHP from there.

Reference

Extension consists of several functions which are clearly mapped to POSIX semaphores API.

posix_sem_open($name, $flags, $mode = 0666, $value = 0)

This is equivalent of sem_open.

Parameters:

  • $name - name of semaphore to open,
  • $flags - opening flags (such as O_CREAT or O_EXCL),
  • $mode - opening mode (default value is 0666),
  • $value - initial value for semaphore (default is 0).

Function returns semaphore resource on success or null on failure.

posix_sem_close($semaphore)

Function closes semaphore resource (in fact it's just a proxy to sem_close).

Parameters:

  • $semaphore - semaphore resource acquired via posix_sem_open.

Returns true on success, false otherwise.

posix_sem_unlink($name)

Unlinks named semaphore from system. The semaphore name is removed immediately. The semaphore itself is removed when all processed having the semaphore opened, close it.

Parameters:

  • $name - name of semaphore to remove.

Returns true on success, false otherwise.

posix_sem_post($semaphore)

Unlocks semaphore. If the semaphore's value consequently becomes greater than zero, then another process or thread blocked in a sem_wait call will be woken up and proceed to lock the semaphore.

Parameters:

  • $semaphore - semaphore resource to unlock (acquired via posix_sem_open).

Returns true on success, false otherwise.

posix_sem_wait($semaphore)

Locks a semaphore. If the semaphore's value is greater than zero, then the decrement proceeds, and the function returns, immediately. If the semaphore currently has the value zero, then the call blocks until either it becomes possible to perform the decrement (i.e., the semaphore value rises above zero), or a signal handler interrupts the call.

Parameters:

  • $semaphore - semaphore resource to unlock (acquired via posix_sem_open).

Returns true on success, false otherwise.

posix_sem_trywait($semaphore)

The same as posix_sem_wait, except that if the decrement cannot be immediately performed, then call returns an error (last error set to EAGAIN) instead of blocking.

posix_sem_timedwait($semaphore, $timeout_sec, $timeout_nsec = 0)

Tries to lock a semaphore (as posix_sem_wait), but if lock could not be performed in a specified timeout, returns and sets last error to ETIMEDOUT.

Parameters:

  • $semaphore - semaphore resource to unlock (acquired via posix_sem_open).
  • $timeout_sec - part of the timeout in seconds.
  • $timeout_nsec - part of the timeout in nanoseconds.

Total timeout is computed as $timeout_sec * 1000000000 + $timeout_nsec and is measured in nanoseconds.

posix_sem_getvalue($semaphore)

Gets value of specified semaphore.

Parameters:

  • $semaphore - semaphore resource which value to get (acquired via posix_sem_open).

Returns semaphore value on success and null on error.

Please note that underlying function sem_getvalue can behave differently according to POSIX specification, so please read your OS documentation on that.

posix_sem_error()

Returns value of last error occured during call of another semaphore-related function.

Notes for PHP users

All semaphore resources are closed automatically when PHP exits. But underlying semaphores are not unlinked by default. You should use register_shutdown_function to unlink all semaphores which you don't need after program exit. Alternative way for that is to manage semaphore creation and deletion outside of PHP.