Semaphore 函数
ftok
将路径名和项目标识符转换为System V IPC KEY。
ftok(string $filename, string $project_id): int
#project_id 项目标识符。这必须是一个字符串。
消息队列
常量
#MSG_IPC_NOWAIT 如果没有desired_message_type类型的消息,立即返回,不要阻塞。 函数将失败并返回一个与MSG_ENOMSG对应的整数值。
#MSG_EXCEPT 将这个标志与大于0的desired_message_type结合使用,将导致函数接收到第一个不等于desired_message_type的消息。
#MSG_NOERROR 如果消息大于max_message_size,设置此标志将将消息截断为max_message_size,并且不会发出错误信号。
#MSG_EAGAIN 队列太大在不阻塞的情况下继续写入返回这个错误号
#MSG_ENOMSG 队列在读取不阻塞的情况下没有消息可读返回这个错误号
msg_get_queue
返回一个id,该id可用于使用给定的键访问System V消息队列。 第一个调用创建具有可选权限的消息队列。 对相同键的第二次调用msg_get_queue()将返回不同的消息队列标识符,但这两个标识符访问相同的底层消息队列。
msg_get_queue(int $key, int $permissions = 0666): SysvMessageQueue|false
#permissions 队列的权限。 默认为0666。 如果消息队列已经存在,则权限将被忽略。
msg_queue_exists
检查消息队列键是否存在。
msg_queue_exists(int $key): bool
msg_receive
将从desired_message_type指定的类型的指定队列中接收第一个消息。
msg_receive(
SysvMessageQueue $queue,
int $desired_message_type,
int &$received_message_type,
int $max_message_size,
mixed &$message,
bool $unserialize = true,
int $flags = 0,
int &$error_code = null
): bool
#desired_message_type 如果desired_message_type为0,则返回队列前面的消息。 如果desired_message_type大于0,则返回该类型的第一个消息。 如果desired_message_type小于0,则将读取队列上第一个类型小于或等于desired_message_type绝对值的消息。 如果没有符合条件的消息,脚本将等待,直到合适的消息到达队列。 可以通过在flags参数中指定MSG_IPC_NOWAIT来防止脚本阻塞。
#received_message_type 接收到的消息的类型将存储在此参数中。
#max_message_size 接收消息的最大大小由max_message_size指定; 如果队列中的消息大于此大小,则函数将失败(除非您设置下面描述的标志)。
#message 接收到的消息将存储在消息中。
#unserialize 如果设置为true,则该消息将被视为使用与会话模块相同的机制进行序列化。
#flags
#error_code 如果函数失败,可选的error_code将被设置为系统errno变量的值。
msg_remove_queue
销毁该队列指定的消息队列。 只有当所有进程都完成了对消息队列的处理,并且您需要释放它所持有的系统资源时,才使用此函数。
msg_remove_queue(SysvMessageQueue $queue): bool
msg_send
向queue指定的消息队列发送类型为message_type(必须大于0)的消息。
msg_send(
SysvMessageQueue $queue,
int $message_type,
string|int|float|bool $message,
bool $serialize = true,
bool $blocking = true,
int &$error_code = null
): bool
#message_type 消息的类型(必须大于0)
#blocking 如果消息太大,无法放入队列,则脚本将等待,直到另一个进程从队列中读取消息,并释放出足够的空间以发送消息。 这叫做阻塞; 你可以通过将可选的blocking参数设置为false来防止阻塞,在这种情况下,如果消息对于队列来说太大,msg_send()将立即返回false,并将可选的error_code设置为MSG_EAGAIN,表示你应该稍后再尝试发送消息。
msg_stat_queue
从消息队列数据结构中返回信息。
msg_stat_queue(SysvMessageQueue $queue): array|false
#msg_perm.uid 队列所有者的uid。
#msg_perm.gid 队列所有者的gid。
#msg_perm.mode 队列的文件访问模式。
#msg_stime 最后一条消息发送到队列的时间。
#msg_rtime 从队列接收到最后一条消息的时间。
#msg_ctime 队列最后一次更改的时间。
#msg_qnum 等待从队列中读取的消息数。
#msg_qbytes 一个消息队列中允许的最大字节数。
#msg_lspid 将最后一条消息发送到队列的进程的pid。
#msg_lrpid 从队列接收到最后一条消息的进程的pid。
msg_set_queue
在消息队列数据结构中设置信息。
msg_set_queue(SysvMessageQueue $queue, array $data): bool
信号量
sem_acquire
获取信号量。默认阻塞,直到可以获取信号量。 当进程试图获取一个已经获取的信号量时,如果获取信号量会导致超过该信号量的最大数量,则该进程将永远阻塞。
sem_acquire(SysvSemaphore $semaphore, bool $non_blocking = false): bool
#non_blocking 指定进程是否不应该等待获取信号量。 如果设置为true,如果不能立即获取信号量,调用将立即返回false。
sem_get
返回一个id,该id可用于使用给定的键访问System V信号量。
对同一个键的第二次调用sem_get()将返回一个不同的信号量标识符,但两个标识符访问相同的底层信号量。
如果key为0,则为每次调用sem_get()创建一个新的私有信号量。
sem_get(
int $key,
int $max_acquire = 1,
int $permissions = 0666,
bool $auto_release = true
): SysvSemaphore|false
#max_acquire 设置信号量可以获取的最大进程数
#permissions 信号量的权限
#auto_release 指定在请求关闭时是否应自动释放信号量
sem_release
释放信号量,如果该信号量目前被调用进程获取,否则将生成警告。
sem_release(SysvSemaphore $semaphore): bool
sem_remove
删除给定的信号量。
sem_remove(SysvSemaphore $semaphore): bool
共享内存
shm_attach
创建或打开一个共享内存段。
shm_attach(int $key, ?int $size = null, int $permissions = 0666): SysvSharedMemory|false
#size 内存大小。 如果没有提供,则默认为sysvshm。 php.ini中的Init_mem,否则10000字节。
#permissions 可选的权限位。默认为0666。
shm_detach
断开由shm_attach()创建的shm提供的共享内存。 请记住,共享内存仍然存在于Unix系统中,数据也仍然存在。
shm_detach(SysvSharedMemory $shm): bool
shm_get_var
在给定的共享内存段中返回具有给定键的变量。 变量仍然存在于共享内存中。
shm_get_var(SysvSharedMemory $shm, int $key): mixed
shm_has_var
检查共享内存段中是否存在特定的键。
shm_has_var(SysvSharedMemory $shm, int $key): bool
shm_put_var
使用给定的键插入或更新值如果shm不是一个有效的Sys V共享内存索引,或者没有足够的共享内存来完成您的请求,将会发出警告(E_WARNING级别)。
shm_put_var(SysvSharedMemory $shm, int $key, mixed $value): bool
shm_remove_var
删除具有给定键的变量并释放所占用的内存。
shm_remove_var(SysvSharedMemory $shm, int $key): bool
shm_remove
删除共享内存shm。 所有数据将被销毁。
shm_remove(SysvSharedMemory $shm): bool
Shared Memory函数
共享内存
shmop_open
创建或打开共享内存块。
shmop_open(
int $key,
string $mode,
int $permissions,
int $size
): Shmop|false
#mode
"a"用于访问(将SHM_RDONLY设置为shmat),当您需要打开一个现有的共享内存段以实现只读时,使用这个标志
"c"用于create(设置IPC_CREATE),当你需要创建一个新的共享内存段,或者如果有一个相同键的共享内存段存在,尝试打开它进行读写时,使用这个标志
"w"用于读写访问,当你需要读写一个共享内存段时,使用这个标志,在大多数情况下使用这个标志
"n"当你想创建一个新的共享内存段,但是如果一个共享内存段已经存在,则会失败。 这对于安全来说很有用,使用它可以防止竞争条件的利用。
shmop_read
从共享内存块读取数据。
shmop_read(Shmop $shmop, int $offset, int $size): string
#offset 开始读取的偏移量
#size 要读取的字节数
shmop_size
用于获取共享内存块的大小(以字节为单位)。
shmop_size(Shmop $shmop): int
shmop_write
将数据写入共享内存块
shmop_write(Shmop $shmop, string $data, int $offset): int
#offset 指定在共享内存段中从何处开始写入数据。
shmop_delete
用于删除共享内存块。
shmop_delete(Shmop $shmop): bool
``