首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Web技术布道师

    php中pcntl_fork创建子进程

    一、php中pcntl_fork函数概述 pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。 $curr_pid.PHP_EOL; //开始创建子进程 $son_pid = pcntl_fork();//返回子进程的id //查看当前进程 echo '创建子进程之后当前的进程为 示例代码分析: (1)发现创建了子进程之后,系统会切换到子进程中,而子进程中的代码是从含有pcntl_fork函数的那行执行的 (2)创建子进程之后,子进程的代码段是拷贝pcntl_fork函数及之后的代码段 ,之前的代码段并不拷贝,但是具体的数据变量子进程仍然会拷贝 (3)可见,fork之后程序会分叉执行,即子进程执行 三、pcntl_fork的业务场景举例 php的多进程中,常用pcntl_fork来实现并发

    1.7K21发布于 2019-03-19
  • 来自专栏北溟有鱼QAQ

    pcntl_exec函数的作用以及用法

    pcntl_exec()函数 用途: 可能我们在编写php代码的时候会很少用到或者见到这个函数,但这个函数一般是用在运行脚本文件的时候才会使用,比如shell脚本,或者运行其他语言的脚本等等 概念 至于什么是解释器文件,大家可以看我之前写过的文章如何编写一个PHP解释器文件 编写代码--可执行文件 编写一个PHP程序,用来打印pcntl_exec 中的第二个参数和第三个参数 <? 我们会看到经过pcntl_exec函数,test.php 里面的代码也执行,这其实就是pcntl_exec的作用,用来执行一个程序 编写代码--解释器文件 编写一个解释器文件,并给这个文件可执行权限 # exitId > 0) { echo "子进程退出成功,退出状态码是 ".pcntl_wexitstatus($status).PHP_EOL; } 再次执行,查看结果 ? 总结 pcntl_exec函数其实是对linux api 中 execve的封装 pcntl_fork函数是对linux api 中 clone 的封装 本文为北溟有鱼

    3.2K20发布于 2021-03-12
  • 来自专栏北溟有鱼QAQ

    PHP中pcntl_sigprocmask的作用是什么

    当你编写程序,想要屏蔽某个或多个信号的时候,那么我们就会用到PHP扩展中的pcntl_sigprocmask函数,这个函数就是用于设置信号屏蔽字的函数,第一个参数就是可以是否设置屏蔽信号字,SIG_BLOCK $signo.PHP_EOL; } pcntl_signal(SIGINT,'sigHandler'); //要屏蔽的信号数组 $sigArray = [SIGINT,SIGUSR1]; //设置信号屏蔽字 pcntl_sigprocmask(SIG_BLOCK,$sigArray); while (1){ //调用等待信号的处理器 pcntl_signal_dispatch(); $signo.PHP_EOL; } pcntl_signal(SIGINT,'sigHandler'); //要屏蔽的信号数组 $sigArray = [SIGINT,SIGUSR1]; //设置信号屏蔽字 pcntl_sigprocmask(SIG_BLOCK,$sigArray); $i = 10 ; while ($i--){ //调用等待信号的处理器 pcntl_signal_dispatch

    98210发布于 2021-04-14
  • 来自专栏陶士涵的菜地

    解决宝塔面板运行php项目 pcntl_fork() has been disabled for security reasons

    这是因为进程管理相关的函数被禁用了 把下面pcntl_下划线开头的函数全删除

    1K10编辑于 2022-01-05
  • 来自专栏程序生涯

    composer update 的时候提示the requested PHP extension pcntl is missing from your system.的方法处理

    今天在composer require aliyuncs/oss-sdk-php的时候报了一个错误如下:

    65530发布于 2020-08-14
  • 来自专栏乌鸦安全

    【实战】对某擦边站点的一次渗透

    filter[]=phpinfo&get[]=-1 此时发现禁用了非常多的函数: passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,pcntl_exec ,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid ,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig ,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask ,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv

    2.9K30编辑于 2022-12-19
  • 来自专栏可能是东半球最正规的API社区

    老李在搞Workerman的日子里(五)

    前年我在写Advance-PHP的时候,PHP里真的只有pcntl_signal_dispatch();一直到最近(具体忘了什么时候了),终于有一个新的函数叫pcntl_async_signals()的函数冒了出来 ( SIGUSR1, "signal_handler" ); pcntl_signal( SIGUSR2, "signal_handler" ); pcntl_sigprocmask( SIG_BLOCK 就是当使用pcntl_sigprocmask()设置了SIGTERM阻塞后,我们可以利用一个叫做pcntl_sigwaitinfo()的函数来检验这种阻塞,而且逗逼的是这个函数本身也是阻塞的,一旦进程收到了 之前我们的demo里一直都是用的while循环不断调用pcntl_wait()或者pcntl_waitpid()来不断地回收,其实这个和在while里不断使用pcntl_signal_dispatch( .. pcntl_async_signals( true ); // 给进程安装信号... pcntl_signal( SIGCHLD, function( $i_signo ) use( $i_pid

    1.2K11发布于 2019-12-11
  • 来自专栏可能是东半球最正规的API社区

    和老李一起搞山寨Workerman(三)

    念及昨日之篇章,洋洋洒洒三千余字满篇pcntl,尽然毫无WM之踪迹。 在PHP中则是由pcntl_wait()和pcntl_waitpid()两个函数来解决。当两个函数同时出现的时候,可考虑通过对比方式使得记忆更加深刻。 时才有效 pcntl_wstopsig:此君则依赖前者,即仅在pcntl_wifstopped()返回 TRUE 时有效 pcntl_wtermsig:此君依赖于pcntl_wifsignaled()为 pcntl_wait()可告一段落,无奈尚有pcntl_waitpid(),此君对于子进程回收控制力度与粒度绝非pcntl_wait()可比,此君你我皆不可弃之。 春宵一刻值千金,绝知此事要躬行 较之pcntl_wait(),pcntl_waitpid()仅多了一个参数:$pid。

    1.4K61发布于 2019-12-11
  • 来自专栏Czy‘s Blog

    简单安全防护

    禁用系统函数 非常危险的函数 eval system exec shell_exec pcntl_exec pcntl_fork pcntl_exec 强烈建议禁止的函数 passthru chown popen proc_open ini_alter ini_restore dl openlog syslog readlink symlink popepassthru pcntl_alarm pcntl_waitpid pcntl_wait pcntl_wifexited pcntl_wifstopped pcntl_wifsignaled pcntl_wifcontinued pcntl_wexitstatus pcntl_wtermsig pcntl_wstopsig pcntl_signal pcntl_signal_dispatch pcntl_get_last_error pcntl_strerror pcntl_sigprocmask pcntl_sigwaitinfo pcntl_sigtimedwait pcntl_getpriority pcntl_setpriority

    1.9K10发布于 2020-08-27
  • 来自专栏Web技术布道师

    如何防止PHP进程异常退出(进程被杀)?

    (SIGTERM, "sig_handler"); pcntl_signal(SIGHUP, "sig_handler"); pcntl_signal(SIGINT, "sig_handler"); pcntl_signal (SIGQUIT, "sig_handler"); pcntl_signal(SIGILL, "sig_handler"); pcntl_signal(SIGPIPE, "sig_handler"); pcntl_signal(SIGALRM, "sig_handler"); ? (SIGTERM, "sig_handler"); pcntl_signal(SIGHUP, "sig_handler"); pcntl_signal(SIGINT, "sig_handler"); pcntl_signal (SIGQUIT, "sig_handler"); pcntl_signal(SIGILL, "sig_handler"); pcntl_signal(SIGPIPE, "sig_handler");

    3K20发布于 2019-07-25
  • 来自专栏网络攻防实战知识交流

    一种绕过php disablefunc的方法复现

    环境搭建 ubuntu+apache2+php7.2 配置 /etc/php/7.2/apache2/php.ini 设置 disable_functions = system,pcntl_alarm, pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued ,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch ,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec ,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, 然后重启apache2 服务器 这样就能把system禁用了 然后在网站的根目录上放一个

    1.9K30发布于 2019-07-23
  • 来自专栏LoRexxar's Blog

    pwnhub_another php web部分

    ,openlog,ini_alter,chroot,fread,fgets,fgetss,file,readfile,ini_set,ini_restore,putenv,apache_setenv,pcntl_alarm ,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,fpassthru,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus ,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,fputs,pcntl_get_last_error,pcntl_strerror ,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

    74530编辑于 2023-02-21
  • 来自专栏网络攻防实战知识交流

    php文件自包含的奇淫技巧

    openlog,ini_alter,chroot,fread,fgets,fgetss,file,readfile, ini_set,ini_restore,putenv,apache_setenv,pcntl_alarm ,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,file_get_contents,fpassthru,pcntl_wifstopped,pcntl_wifsignaled ,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,fputs,unlink, pcntl_get_last_error ,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority, pcntl_setpriority 那我们通过提交如下代码来获取flag <?

    1.4K10发布于 2019-07-24
  • 来自专栏学习乐园

    php多进程中的阻塞与非阻塞操作实例分析

    分享给大家供大家参考,具体如下: 我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程。 子进程退出后,父进程没有及时回收,就会产生僵尸进程。 / /ork(); if($pids[$i] == -1) { die('fork error'); } else if ($pids[$i]) { pcntl_wait($status); (); if($pids[$i] == -1) { die('fork error'); } else if ($pids[$i]) { pcntl_wait($status, WNOHANG ); } else { echo getmypid() , " {$i} rn"; exit; } } 我们可以通过设置pcntl_wait的第二个参数为WNOHANG来控制进程是否阻塞。 pcntl_wait等同于以pid为-1调用pcntl_waitpid函数。 pcntl_waitpid函数可以等待指定pid的进程。 希望本文/ /所述对大家PHP程序设计有所帮助。

    95800发布于 2021-07-13
  • 来自专栏码农编程进阶笔记

    PHP进程间通信-信号

    实际上在父进程不断while循环调用pcntl_waitpid()是个解决办法,大概代码如下: $pid = pcntl_fork(); if( 0 > $pid ){ exit('fork error 第三次:此时父进程已经执行了pcntl_waitpid(),将已经退出的子进程回收,释放了pid等资源。 那么,在php里给进程安装信号处理器使用的函数是pcntl_signal(),让信号处理器跑起来的函数是pcntl_signal_dispatch()。 pcntl_signal(),安装一个信号处理器,具体说明是pcntl_signal ( int signo , callback handler [, bool pcntl_signal_dispatch ( 1 ); // 注释掉原来老掉牙的代码,转而使用pcntl_signal_dispatch() //pcntl_waitpid( $pid, &$status, WNOHANG );

    2K20发布于 2021-07-20
  • 来自专栏鸿鹄实验室

    CVE-2018-9206渗透实战

    ,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus ,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror ,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority , pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled ,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority

    1.4K20发布于 2021-04-15
  • 来自专栏卓文见识

    CTF系列——DASCTF四月春季赛Writeup

    > set_time_limit,ini_set,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped ,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler ,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait ,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open

    6.4K40发布于 2020-05-09
  • 来自专栏枕边书

    初探PHP多进程

    创建子进程 创建PHP子进程是多进程的开始,我们需要pcntl_fork()函数; fork函数详解 pcntl_fork() — 在当前进程当前位置产生分支(子进程)。 此函数创建了一个新的子进程后,子进程会继承父进程当前的上下文,和父进程一样从pcntl_fork()函数处继续向下执行,只是获取到的pcntl_fork()的返回值不同,我们便能从判断返回值来区分父进程和子进程 pcntl_fork()函数成功执行时会在父进程返回子进程的进程id(pid),因为系统的初始进程init进程的pid为1,后来产生进程的pid都会大于此进程,所以我们可以通过判断pcntl_fork( )的返回值大于1来确实当前进程是父进程; 而在子进程中,此函数的返回值会是固定值0,我们也可以通过判断pcntl_fork()的返回值为0来确定子进程; 而pcntl_fork()函数在执行失败时,会在父进程返回 我们需要在父进程里使用pcntl_signal()函数和pcntl_signal_dispatch()函数来给各个子进程安装信号处理器。

    1.8K80发布于 2018-01-04
  • 来自专栏全栈程序员必看

    PHP进程间通信-信号

    实际上在父进程不断while循环调用pcntl_waitpid()是个解决办法,大概代码如下: $pid = pcntl_fork(); if( 0 > $pid ){ exit('fork error 第三次:此时父进程已经执行了pcntl_waitpid(),将已经退出的子进程回收,释放了pid等资源。 那么,在php里给进程安装信号处理器使用的函数是pcntl_signal(),让信号处理器跑起来的函数是pcntl_signal_dispatch()。 pcntl_signal(),安装一个信号处理器,具体说明是pcntl_signal ( int signo , callback handler [, bool pcntl_signal_dispatch ( 1 ); // 注释掉原来老掉牙的代码,转而使用pcntl_signal_dispatch() //pcntl_waitpid( $pid, &$status, WNOHANG );

    2.6K10编辑于 2022-07-11
  • 来自专栏PHP修行之路

    【多进程】php多进程编程

    /pcntl 依次执行以下命令 phpize . 到这里pcntl 模块就安装好啦,下面开始编码 for ($i = 0; $i < 3; $i++){ $pid = pcntl_fork(); if ($pid == -1) = -1) { $status = pcntl_wexitstatus($status); echo "子进程推出,状态码 $status \n"; } pcntl_fork( pcntl_wifexited($status)){ //进程非正常退出 if(pcntl_wifsignaled($status)){ pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断 pcntl_wtermsig — 返回导致子进程中断的信号 我们打开两个窗口,其中一个 ? ?

    1.1K20发布于 2019-07-15
领券