ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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() ~~~