[TOC]
* * * * *
## 1 PCNTL进程控制
### 1 简介
进程控制PCNTL实现了unix方式的进程操作
不能用于web服务器环境模式
只使用于unix平台
### 2 使用
~~~
<?php
//定义ticks
declare( ticks = 1 );
//产生子进程分支
$pid = pcntl_fork ();
if ( $pid == - 1 ) {
//pcntl_fork返回-1标明创建子进程失败
die( "could not fork" );
} else if ( $pid ) {
//父进程中pcntl_fork返回创建的子进程进程号
exit();
} else {
// 子进程pcntl_fork返回的时0
}
// 从当前终端分离
if ( posix_setsid () == - 1 ) {
die( "could not detach from terminal" );
}
// 安装信号处理器
pcntl_signal ( SIGTERM , "sig_handler" );
pcntl_signal ( SIGHUP , "sig_handler" );
// 执行无限循环任务
while ( 1 ) {
// 等待用户操作请求
}
function sig_handler ( $signo )
{
switch ( $signo ) {
case SIGTERM :
// 处理中断信号
exit;
break;
case SIGHUP :
// 处理重启信号
break;
default:
// 处理所有其他信号
}
}
?>
~~~
### 3 函数接口
#### pcntl_fork() 创建子进程
`int pcntl_fork ( void )`
父进程返回子进程pid>0
子进程返回0
创建失败父进程上下文返回-1
#### pcntl_singal() 安装信号处理器
~~~
bool pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls = true ] )
~~~
> $signo:信号
> $handler:回调处理
为指定的信号创建回调处理函数
#### pcntl_signal_dispatch() 分发信号
将接受到的信号进行广播分发
#### pcntl_wait() pcntl_waitpid()等待进程退出
`int pcntl_wait ( int &$status [, int $options = 0 ] )`
> $status: 获取子进程退出的状态信息
> $options:
>> WNOHANG 如果没有子进程退出立刻返回。
>> WUNTRACED 子进程已经退出并且其状态未报告时返回。
挂起当前进程直到一个子进程退出
或接受到一个信号要求中断当前进程
或调用一个信号处理函数
`int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )`
> $pid: 等待进程id
>> [< -1] 等待任意进程组ID等于参数pid给定值的绝对值的进程。
> [-1] 等待任意子进程;与pcntl_wait函数行为一致。
> [0] 等待任意与调用进程组ID相同的子进程。
> [> 0] 等待进程号等于参数pid值的子进程。
挂起当前进程直到pid指定的进程号的进程退出
或接受到一个信号要求中断当前进程
或调用一个信号处理函数
#### pcntl_exex() 当前进程执行指定的程序
`void pcntl_exec ( string $path [, array $args [, array $envs ]] )`
> $path: 可执行程序路径
> $args: 参数数组
> $envs: 环境变量数组
当前进程运行指定可执行文件
#### pcntl_alarm() 设置一个alarm闹钟信号
`int pcntl_alarm ( int $seconds )`
> $seconds:定时时间秒数
在指定的秒数后向进程发送一个 SIGALRM 信号
每次对 pcntl_alarm() 的调用都会取消之前设置的alarm信号
可以用来实现计时器
返回alarm调度剩余的描述,没有alarm调度返回0
## 2 POSIX标准接口
>[info] 当前进程操作
~~~
posix_getpid()
返回当前进程的进程id
posix_getppid()
返回当前进程的父进程id
posix_getpgrp()
返回当前进程的进程组id
posix_getgid()
返回当前进程的gid
posix_setgid()
设置当前进程的gid
posix_getgroups()
返回当前进程的进程组集合
~~~
>[info] 当前进程其他操作
~~~
posix_times()
返回当前进程cpu耗时
posix_getuid()
返回当前进程的用户id
posix_getegid()
返回当前进程的有效gid
posix_setegid()
设置当前进程的有效gid
posix_geteuid()
返回当前进程的有效uid
posix_seteuid()
设置当前进程的有效uid
posix_getpgid()
获取进程的pgid
posix_setpgid()
设置进程的pgid
posix_getsid()
获取进程的当前会话id
posix_setsid()
设置进程的当前会话id
posix_getgrgid()
获取进程组的信息
posix_getgrnam()
获取进程组的信息
posix_getpgid()
返回进程的进程组
posix_getsid()
返回进程的会话id
~~~
>[info] 用户信息操作
~~~
posix_getlogin()
获取登录用户名
posix_getpwnam()
获取指定用户信息
posix_getwuid()
获取指定用户信息
~~~
>[info] 文件操作
~~~
posix_access()
设置文件权限模式
posix_ctermid()
获取控制器终端当前路径
posix_getcwd()
获取当前目录信息
posix_mkfifo()
posix_mknod()
~~~
>[info] 其他操作
~~~
posix_kill() 发送sig信号到pid进程
posix_uname() 获取系统名称
posix_ttyname() 设置终端设备名称
posix_strerror() 输出错误代号
posix_getrlimit() 获取系统资源限制
~~~
## 3 执行外部程序
~~~
exec()
passthru()
shell_exec()
system()
proc_open()
proc_terminate()
proc_nice()
proc_get_status()
proc_close()
~~~