PHP函数
进程控制
## 一、PCNTL PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 PCNTL现在使用了ticks作为信号处理的回调机制,ticks在速度上远远超过了之前的处理机制。 这个变化与“用户ticks”遵循了相同的语义。您可以使用declare() 语句在程序中指定允许发生回调的位置。这使得我们对异步事件处理的开销最小化。在编译PHP时 启用pcntl将始终承担这种开销,不论您的脚本中是否真正使用了pcntl。 构建此扩展不需要其他扩展。此扩展没有在 php.ini 中定义配置指令。 在PHP中进程控制支持默认是关闭的。您需要使用 --enable-pcntl 配置选项重新编译PHP的 CGI或CLI版本以打开进程控制支持。即非Unix类系统不支持此模块。 - int pcntl_alarm ( int $seconds ) 创建一个计时器,在指定的秒数后向进程发送一个SIGALRM信号。每次对 pcntl_alarm()的调用都会取消之前设置的alarm信号。如果seconds设置为0,将不会创建alarm信号。返回上次alarm调度(离alarm信号发送)剩余的秒数,或者之前没有alarm调度(译注:或者之前调度已完成) 时返回0。 - void pcntl_exec ( string $path [, array $args [, array $envs ]] ) 在当前进程空间执行指定程序。当发生错误时返回 FALSE ,没有错误时没有返回。 - int pcntl_fork ( void ) 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。 ```php $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 } ``` - bool pcntl_setpriority ( int $priority [, int $pid = getmypid() [, int $process_identifier = PRIO_PROCESS ]] ) 修改任意进程的优先级。如果没有指定pid,默认是当前进程的进程号 - int pcntl_getpriority ([ int $pid = getmypid() [, int $process_identifier = PRIO_PROCESS ]] ) 获取任意进程的优先级。如果没有指定pid,默认是当前进程的进程号。返回进程的优先级或在错误时返回 FALSE 。 值越小代表优先级越高。 process_identifier PRIO_PGRP(译注:获取进程组优先级), PRIO_USER (译注:获取用户进程优先级) PRIO_PROCESS(译注:默认值;获取进程优先级) - bool pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls = true ] ) 为signo指定的信号安装一个新的信号处理器。 - bool pcntl_signal_dispatch ( void ) 调用每个等待信号通过pcntl_signal() 安装的处理器。 - int|string pcntl_signal_get_handler ( int $signo ) 获取指定信号的当前处理程序 - bool pcntl_sigprocmask ( int $how , array $set [, array &$oldset ] ) 用来增加,删除或设置阻塞信号,具体行为 依赖于参数how。 - how - 设置pcntl_sigprocmask()函数的行为。 可选值: - SIG_BLOCK: 把信号加入到当前阻塞信号中。 - SIG_UNBLOCK: 从当前阻塞信号中移出信号。 - SIG_SETMASK: 用给定的信号列表替换当前阻塞信号列表。 - set - 信号列表。 - oldset - oldset是一个输出参数,用来返回之前的阻塞信号列表数组。 - int pcntl_sigtimedwait ( array $set [, array &$siginfo [, int $seconds = 0 [, int $nanoseconds = 0 ]]] ) 实际上与pcntl_sigwaitinfo() 的行为一致,不同在于它多了两个增强参数seconds和 nanoseconds,这使得脚本等待的事件有了一个时间的上限。成功时,返回信号编号。 - - int pcntl_sigwaitinfo ( array $set [, array &$siginfo ] ) 暂停调用脚本的执行直到接收到set 参数中列出的某个信号。只要其中的一个信号已经在等待状态(比如: 通过pcntl_sigprocmask()函数阻塞), 函数pcntl_sigwaitinfo()就回立刻返回 Siginfo是一个输出参数,用来返回信号的信息 以下元素会为所有信号设置: signo: 信号编号 errno: 错误编号 code: 信号代码 下面元素可能会为SIGCHLD信号设置: status: 退出的值或信号 utime: 用户消耗的时间 stime: 系统(内核)消耗的时间 pid: 发送进程ID uid: 发送进程的实际用户ID 信号SIGILL, SIGFPE, SIGSEGV 和 SIGBUS 可能会被设置的元素: addr: 发生故障的内存位置 可能会为SIGPOLL 信号设置的元素: band: Band event fd: 文件描述符 - int pcntl_wait ( int &$status [, int $options = 0 ] ) 等待或返回fork的子进程状态。挂起当前进程的执行,直到一个子进程退出,或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将被释放。 - int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] ) 等待或返回fork的子进程状态。挂起当前进程的执行,直到参数pid指定的进程号的进程退出, 或接收到一个信号要求中断当前进程或调用一个信号处理函数。如果pid指定的子进程在此函数调用时已经退出(俗称僵尸进程),此函数将立刻返回。 - bool pcntl_wifstopped ( int $status ) 仅查子进程当前是否停止; 此函数只有作用于使用了WUNTRACED作为 option的pcntl_waitpid()函数调用产生的status时才有效。 - int pcntl_wstopsig ( int $status ) 返回导致子进程停止的信号编号。这个函数仅在pcntl_wifstopped()返回 TRUE 时有效。 - bool pcntl_wifexited ( int $status ) 检查状态代码是否代表一个正常的退出。 - int pcntl_wexitstatus ( int $status ) 返回一个中断的子进程的返回代码。这个函数仅在函数pcntl_wifexited()返回 TRUE.时有效。 - bool pcntl_wifsignaled ( int $status ) 检查子进程状态码是否代表由于某个信号而中断 - int pcntl_wtermsig ( int $status ) 返回导致子进程中断的信号编号。这个函数仅在pcntl_wifsignaled() 返回 TRUE 时有效。 pcntl_strerror— 获取与给定的错误相关的系统错误消息 pcntl_errno— 别名 pcntl_get_last_error pcntl_get_last_error— 获取最近进程产生的错误 ## 二、程序执行 这些函数提供执行系统本身命令的能力, 以及安全执行系统命令。在 Windows 平台上,所有命令执行都是通过 cmd.exe 来完成的。使用这些函数不需要安装,它们是 PHP 核心的一部分。 - string escapeshellarg ( string $arg ) 把字符串转码为可以在 shell 命令里使用的参数。将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。 - string escapeshellcmd ( string $command ) shell 元字符转义。对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。 - void passthru ( string $command [, int &$return_var ] ) 执行外部程序并且显示原始输出。当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。 - string shell_exec ( string $cmd ) 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。 当进程执行过程中发生错误,或者进程不产生输出的情况下,都会返回 NULL, 所以,使用本函数无法通过返回值检测进程是否成功执行。 如果需要检查进程执行的退出码,请使用 exec() 函数。 - string system ( string $command [, int &$return_var ] ) 本函数执行 command 参数所指定的命令, 并且输出执行结果。 如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。 如果要获取一个命令未经任何处理的 原始输出, 请使用 passthru() 函数。 -string exec ( string $command [, array &$output [, int &$return_var ]] 执行一个外部程序。 - command: 要执行的命令。 - output: 如果提供了 output 参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。 数组中的数据不包含行尾的空白字符,例如 \n 字符。 请注意,如果数组中已经包含了部分元素,exec() 函数会在数组末尾追加内容。如果你不想在数组末尾进行追加, 请在传入 exec() 函数之前 对数组使用 unset() 函数进行重置。 - return_var: 如果同时提供 output 和 return_var 参数, 命令执行后的返回状态会被写入到此变量。 Warning: 当用户提供的数据传入此函数,使用 escapeshellarg() 或 escapeshellcmd() 来确保用户欺骗系统从而执行任意命令。 Note: 如何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。 - resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array$other_options ]]] ) 执行一个命令,并且打开用来输入/输出的文件指针。 - bool proc_terminate ( resource $process [, int $signal = 15 ] ) 杀除由 proc_open 打开的进程。 proc_terminate() 调用之后将会立即返回, 而不会等待进程终止。 - array proc_get_status ( resource $process ) 获取由 proc_open() 函数打开的进程的信息。调用成功,则返回一个包含了进程信息的 array,如果发生错误,返回 FALSE。 - bool proc_nice ( int $increment ) 修改当前进程的优先级, 修改量由 increment 参数指定。 increment 为正数会降低当前进程优先级, 反之,为负数会提高优先级。在 Unix 系统上,较低的值表示较高的优先级,例如:-20, 而正数值表示更低的优先级。 ## 三、Pthreads pthreads 是一组允许用户在 PHP 中使用多线程技术的面向对象的 API。 它提供了创建多线程应用所需的全套工具。 通过使用 Thread, Worker 以及 Threaded 对象,PHP 应用可以创建、读取、写入以及执行多线程应用,并可以在多个线程之间进行同步控制。 Warning 不可以在 web 服务器环境中使用 pthreads 扩展, PHP 多线程开发仅限于命令行模式的应用。 要使用 pthreads 扩展,需要构建 PHP 时启用 ZTS (Zend Thread Safety)。(--enable-maintainer-zts 选项, Windows 平台为 --enable-zts) ZTS 是构建期配置选项,只能通过构建时通过选项启用,无法在构建之后启用。 要构建 pthreads 扩展,你需要启用了 ZTS 的 PHP 以及 Posix Threads 头文件(pthread.h)。对于 Windows 平台,需要使用 redhat 的 pthread-w32 项目中的 pthread.h 头文件。 #### Threaded — Threaded 类 Threaded 对象提供支持 pthreads 操作的基本功能,包括同步方法以及其他对程序员很有帮助的接口。 重要的是,Threaded 提供了隐式的线程安全机制,这个对象中的所有操作都是线程安全的。 - Threaded::run— 如果需要在多线程环境下执行代码,必须实现本方法 - Threaded::chunk— 获取给定数量的对象属性表,可以选择是否保留键名称 - Threaded::count— 返回对象的属性数量 - Threaded::extend— 运行操作 - Threaded::from— 从闭包创建匿名线程对象 - Threaded::merge— 将数据合并到当前对象 - Threaded::notify— 向对象发送唤醒通知 - Threaded::shift— 弹出对象属性表中第一项数据 - Threaded::pop— 弹出对象属性表中的最后一项数据 - Threaded::synchronized— 在发起调用的线程上下文中获取对象同步锁,然后同步执行代码块 - Threaded::unlock— 从调用上下文中解锁被引用的对象 - Threaded::wait— 让发起调用的线程进入等待状态,直到收到其他线程的唤醒通知 - Threaded::isRunning— 检测对象是否正在运行 - Threaded::isTerminated— 检测是否因致命错误或未捕获的异常而导致执行过程异常终止 - Threaded::isWaiting— 检测对象是否在等待其他线程唤醒,pthreads v3 中已移除此方法 - Threaded::getTerminationInfo— 错误检测,pthreads v3 中已移除此方法 - Threaded::lock— 同步控制,pthreads v3 中已移除此方法 #### Thread — Thread 类 当调用 Thread 对象的 start 方法时,该对象的 run 方法中的代码将在独立线程中并行执行。 run 方法中的代码执行完毕之后,独立线程立即退出,并且等待合适的时机由创建者线程加入(join)。 Warning 依赖于引擎本身的机制检测何时加入线程可能引发非预期的行为,程序员应该尽可能的显式控制线程加入的时机。 - Thread::getCreatorId— 返回创建当前线程的线程ID - Thread::getCurrentThreadId— 返回当前执行线程的ID - Thread::getThreadId— 返回引用线程的ID[这几个值往往一样] - Thread::getCurrentThread— 获取当前执行线程的引用。 - Thread::isJoined— 线程是否已经被加入(join) - Thread::isStarted— 线程是否开始执行 - Thread::join— 让当前执行上下文等待被引用线程执行完毕 - Thread::start— 在独立线程中执行 run 方法 - Thread::detach— threads v3 中已经移除此方法. - Thread::globally— pthreads v3 中已经移除此方法. - Thread::kill— pthreads v3 中已移除此方法。 #### Worker — Worker 类 Worker 是一个具有持久化上下文的线程对象,通常用来在多个线程中使用。 当一个 Worker 对象开始之后,会执行它的 run 方法,但是即使 run 方法执行完毕,线程本身也不会消亡,除非遇到以下情况: ?Worker 对象超出作用范围(没有指向它的引用了) ?代码调用了 Worker 对象的 shutdown 方法 ?整个脚本终止了 这意味着程序员可以在程序执行过程中重用这个线程上下文: 在 Worker 对象的栈中添加对象会激活 Worker 对象执行被加入对象的 run 方法。 Warning 程序员必须保持入栈对象的引用,直到它执行完毕或者出栈。 Pool 类提供了 Worker 对象的高层抽象, 它可以帮助程序员管理这些引用。 - Worker::stack— 将要执行的任务入栈到 Worker 对象 - Worker::unstack— 把 Worker 栈顶的(最老的那个)任务从栈中移除。 - Worker::shutdown— 在执行完已入栈对象之后,关闭这个 Worker 对象 - Worker::getStacked— 返回栈中剩余的任务数量 - Worker::isShutdown— 状态检测,Worker 对象是否被关闭 - Worker::isWorking— 状态检测,Worker 对象是否正在执行栈中对象 - Worker::collect— 允许工人收集由可选的给定收集器确定为垃圾的引用。 #### Pool — Pool 类 Pool 对象是多个 Worker 对象的容器,同时也是它们的控制器。 线程池是对 Worker 功能的高层抽象,包括按照 pthreads 需要的方式来管理应用的功能。 - Pool::collect— 回收已完成任务的引用 - Pool::_\_construct— 创建新的 Worker 对象池 - Pool::resize— 改变 Pool 对象的可容纳 Worker 对象的数量 - Pool::shutdown— 停止所有的 Worker 对象 - Pool::submit— 提交对象以执行 - Pool::submitTo— 提交一个任务到特定的 Worker 以执行 ## 四、POSIX >【此扩展默认是打开的,在 Windows 平台上不可用】 - int posix_getuid():返回当前进程的真实用户ID - int posix_geteuid():返回当前进程的有效用户ID - array posix_getpwuid(int $uid):通过用户id返回用户的信息 - array posix_getpwnam(string $username):通过用户名返回用户的信息 - string posix_getlogin():返回当前进程拥有者的登陆名 - int posix_getegid():返回当前进程的有效组ID - int posix_getgid() :返回当前进程的真实组ID - array posix_getgroups():返回当前进程的组集 - array posix_getgrgid(int $gid) :通过组id返回一个组的信息 - array posix_getgrnam(string $name):通过组名返回一个组的信息 - int posix_getpgid(int $pid): 获取作业控制的进程组ID - int posix_getpgrp():返回当前进程组标识符 - int posix_getpid() :返回当前进程 id - int posix_getppid() :返回当前进程的父进程的进程标识符。 - int posix_getsid(int $pid):返回进程PID的会话ID。进程的会话ID是会话领导者的进程组ID。 - bool posix_seteuid(int $uid):设置当前进程的有效UID - bool posix_setuid(int $uid):设置当前进程的真实用户ID - int posix_setsid() : 使当前进程成为会话负责人 - bool posix_setegid(int $gid):设置当前进程的有效组ID。 - bool posix_setgid(int $gid):设置当前进程的真实组ID - bool posix_setpgid(int $pid,int $pgid):让进程PID加入进程组。 - string posix_getcwd() :当前目录的路径名 - string posix_ctermid():获取控制终端的路径名 - array posix_uname() :得到系统的名称 - array posix_times() :获得进程的相关时间 - bool posix_isatty(mixed $fd):确定文件描述符是否是交互式终端 - bool posix_kill(int $pid,int $sig):用进程标识符PID发送信号到进程。 - int posix_get_last_error():返回最近失败的posix函数错误码 - string posix_strerror(int $errno):返回与给定的错误相关的POSIX系统错误消息。 - string posix_ttyname(mixed $fd):返回在文件描述符FD上打开的当前终端设备的绝对路径的字符串。 - bool posix_initgroups(string $name,int $base_group_id):为指定名称的用户计算组访问列表。 - bool posix_access(string $file[,int $mode= POSIX_F_OK] ): :检测文件是否可以访问 - array posix_getrlimit():返回关于系统资源限制的信息 - bool posix_setrlimit(int $resource,int $softlimit,int $hardlimit): 设置给定系统资源的软限制和硬限制。 - bool posix_mkfifo(string $pathname,int $mode): :创建一个FIFO特殊文件(命名管道) - bool posix_mknod(string $pathname,int $mode[,int $major= 0[,int $minor= 0]] ) 创建一个特殊的或普通的文件。 ```html SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIGILL 建立CORE文件 非法指令 SIGTRAP 建立CORE文件 跟踪自陷 SIGBUS 建立CORE文件 总线错误 SIGSEGV 建立CORE文件 段非法错误 SIGFPE 建立CORE文件 浮点异常 SIGIOT 建立CORE文件 执行I/O自陷 SIGSTOP 停止进程 非终端来的停止信号 SIGTSTP 停止进程 终端来的停止信号 SIGTTOU 停止进程 后台进程写终端 SIGTTIN 停止进程 后台进程读终端 SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGXGPU 终止进程 CPU时限超时 SIGXFSZ 终止进程 文件长度过长 SIGPROF 终止进程 统计分布图用计时器到时 SIGUSR1 终止进程 用户定义信号1 SIGUSR2 终止进程 用户定义信号2 SIGVTALRM 终止进程 虚拟计时器到时 SIGKILL 终止进程 杀死进程 SIGPIPE 终止进程 向一个没有读进程的管道写数据 SIGALARM 终止进程 计时器到时 SIGTERM 终止进程 软件终止信号 SIGCONT 忽略信号 继续执行一个停止的进程 SIGURG 忽略信号 I/O紧急信号 SIGIO 忽略信号 描述符上可以进行I/O SIGCHLD 忽略信号 当子进程停止或退出时通知父进程 SIGWINCH 忽略信号 窗口大小发生变化 ```
顶部
收展
底部
[TOC]
目录
PHP函数 字符串函数
PHP函数 数组函数
PHP函数 文件目录函数
日期时间函数
MySQL函数
正则函数
数学函数
cURL 函数
XML函数
加密函数
Session函数
URL函数
Apache 函数
Bzip2 压缩与归档扩展
GNU Readline 针对命令行的扩展
网络函数
进程控制
变量与类型相关扩展函数
影响 PHP 行为的扩展
相关推荐
PHP基础
PHP设计模式
PHP算法
PHP版本