GVKun编程网logo

PHP:pcntl_fork()真的做什么?(php pcntl_fork)

17

这篇文章主要围绕PHP:pcntl_fork和真的做什么?展开,旨在为您提供一份详细的参考资料。我们将全面介绍PHP:pcntl_fork的优缺点,解答真的做什么?的相关问题,同时也会为您带来pcph

这篇文章主要围绕PHP:pcntl_fork真的做什么?展开,旨在为您提供一份详细的参考资料。我们将全面介绍PHP:pcntl_fork的优缺点,解答真的做什么?的相关问题,同时也会为您带来p c php pcntl_fork和pcntl_fork 的用法、pcntl_fork和pcntl_fork 的用法、pcntl_fork安装以及实现PHP多进程、pcntl_fork()返回致命错误:调用未定义函数pcntl_fork()的实用方法。

本文目录一览:

PHP:pcntl_fork()真的做什么?(php pcntl_fork)

PHP:pcntl_fork()真的做什么?(php pcntl_fork)

PHP的pcntl_fork函数应该像C中的标准fork函数一样分叉进程

但是我想知道这个函数是否真的推动了这个过程,或者它是否以不同的方式模拟了这个行为。

如果它确实推动了这个过程,那么很清楚哪个过程是:Apache的子过程之一。

只要Apache使用prefork MPM(即每个请求一个进程)就行。

但是,如果Apache使用worker MPM会发生什么?

当使用worker MPM时,每个Apachesubprocess都包含许multithreading,每个进程处理不同的HTTP请求。 所以,如果你在这种情况下分叉进程,我甚至不会想到会发生什么事情发生在所有这些线程和请求被服务。

所以如果pcntl_fork()真的分叉了这个过程,那么如果你设置Apache来使用worker MPM,那么使用这个函数并不是一个好主意。

专家说什么? 我推理得好,还是我只是胡说?

C ++ forksubprocess,请求subprocess列表,在Linux中杀死进程

跟踪进程的系统调用和所有分支进程

fork()后出现libCurl SSL错误

父母怎样才能用一根pipe子给n个孩子发消息?

如何从孩子使用命名的信号量

pcntl_fork可能像你认为的那样工作:它分叉当前进程,就像C函数fork所做的那样:

pcntl_fork()函数仅在其PID和PPID中创建一个与父进程不同的子进程。

请查看您的系统的fork(2)手册页,了解fork如何在您的系统上工作的具体细节。

但是,引用手册的过程控制部分介绍 :

PHP中的进程控制支持实现了进程创建,程序执行,信号处理和进程终止的Unix风格。

不应在Web服务器环境中启用过程控制,如果在Web服务器环境中使用任何过程控制功能,则可能会发生意外的结果。

所以,你不应该从通过Apache执行的PHP脚本中实际使用这个函数:只有当你的PHP脚本从命令行执行时才应该使用它。

而且,在开始使用该功能之前,不要忘记:

注意:此扩展在Windows平台上不可用。

首先,在为MPM配置的Apache安装上运行PHP作为模块并不是一个好主意,因为PHP不是线程安全的(我认为这也是在PHP手册中的某处)。

它应该分叉的过程,是的。 PHP手册甚至指出你应该阅读man fork(2)以获得进一步的说明,所以它可能只是C fork函数的一个包装。

更新 :以下是工作人员MPM的PHP手册中的相关页面: http : //PHP.net/install.unix.apache2.PHP

注意:要构建一个多线程版本的Apache,目标系统必须支持线程。 在这种情况下,PHP也应该使用实验Zend线程安全(ZTS)来构建。 在这种配置下,并不是所有的扩展都可用。 建议的设置是使用默认的prefork MPM-modulee构建Apache。

我还发现这个页面有一些进一步的说明: http : //www.stevekallestad.com/blog/apache_worker_mpm_with_PHP.html

我会尽力快速简洁,

使用“fork”通过apache是​​可能的,你需要“安装”,然后启用PHP.ini中的功能,最后你需要在apache directori中添加扩展(一个符号链接也可以完成这项工作)

echo "extension=pcntl.so" > /etc/PHP5/conf.d/pcntl.ini ln -s /etc/PHP5/apache2/conf.d/pcntl.ini /etc/PHP5/mods-available/pcntl.ini

另一方面,我已经使用fork了很多项目,并且在优化大部分项目方面真的很棒,但是,在使用apache来滥用它的时候会出现一些bug,我基本上会把分叉的孩子分开,铁杆的东西,它的工作原理…很不错,但在加载之前,它开始创建僵尸进程之前工作了一段时间,我可以使用“pcntl_signal(SIGCHLD,SIG_IGN)管理僵尸进程; 它基本上会在孩子完成任务后立即移除这个过程,这有点帮助,然后是当apache变疯狂,开始线程化并最终崩溃你的服务器,我无法解释这种行为(但是,我会)这个由Apache创建的堰/邪恶的树只能从“ps”,也不能从服务器状态或apache日志中看到,我说邪恶的树,因为它基本上创造了与儿童的孩子的百个进程…

简而言之:

叉与Apache将工作? 是的,一点没错

只是不要滥用它

希望这将有助于一个人

我刚刚尝试通过apache使用pcntl_fork,奇怪的情况是,在fork一个子进程之后,父进程将标准输出(浏览器)给它的子进程。 所以,你可以通过镜像,浏览器不能收到父进程的输出。

p c php pcntl_fork和pcntl_fork 的用法

p c php pcntl_fork和pcntl_fork 的用法

pcntl_fork()函数就是为当前的进程创建一个子进程。并且先运行父进程,返回的是子进程的PID,肯定大于零。在父进程的代码中可以用pcntl_fork(&$status)暂停父进程知道他的子进程有返回值。注意:父进程的阻塞同时会阻塞子进程。但是父进程的结束不影响子进程的运行。
父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子进程)。在子进程的代码块中最好有exit语句,即执行完子进程后立即就结束。否则它会又重头开始执行这个脚本的某些部分(一直没有总结出规矩)。
总之,注意两点:
1。子进程最好有一个exit;语句,防止不必要的出错;
2.

复制代码 代码如下:


$pid = pcntl_fork();
//这里最好不要有其他的语句
if ($pid == -1) {
die(''could not fork'');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}

以上就介绍了p c php pcntl_fork和pcntl_fork 的用法,包括了p c方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

pcntl_fork和pcntl_fork 的用法

pcntl_fork和pcntl_fork 的用法

这是两个php的多线程的方法,在Windows下不可用,在Linux下需要编译

  pcntl_fork()函数就是为当前的进程创建一个子进程。并且先运行父进程,返回的是子进程的PID,肯定大于零。在父进程的代码中可以用 pcntl_fork(&$status)暂停父进程知道他的子进程有返回值。注意:父进程的阻塞同时会阻塞子进程。但是父进程的结束不影响子进 程的运行。

  父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子 进程)。在子进程的代码块中最好有exit语句,即执行完子进程后立即就结束。否则它会又重头开始执行这个脚本的某些部分(一直没有总结出规矩)。

  总之,注意两点:

1。子进程最好有一个exit;语句,防止不必要的出错;

2.

$pid pcntl_fork();

//这里最好不要有其他的语句
if (
$pid == -1) {
     die(
''could not fork'');
} else if (
$pid) {
     
// we are the parent
     
pcntl_wait($status); //Protect against Zombie children
} else {
     
// we are the child
}

pcntl_fork安装以及实现PHP多进程

pcntl_fork安装以及实现PHP多进程

PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展,有时间在ubuntu下玩了下。

    1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是

创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令

# mkdir php
# cd php
# apt-get source php5
# cd php5-(WHATEVER_RELEASE)/ext/pcntl
# phpize
# ./configure (注一)
# make
# make install 

phpize 命令是用来准备 php 外挂模块的编译环境的。 

 

成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。
需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此外挂模块。 

 

    2,开始实验pcntl_fork

01
02 //while(1)//循环采用3个进程
03 //{
04 //declare(ticks=1);
05 $bWaitFlag = FALSE; // 是否等待进程结束
06 //$bWaitFlag = TRUE; // 是否等待进程结束
07 $intNum = 3; // 进程总数
08 $pids = array(); // 进程PID数组

pcntl_fork()返回致命错误:调用未定义函数pcntl_fork()

pcntl_fork()返回致命错误:调用未定义函数pcntl_fork()

我在mac上用mamp集成环境跑的一个项目上要使用到pcntl_fork()函数,但奇怪的是我检查过php.ini已经加载了pcntl扩展,composer也安装了ext-pcntl,但是调用的时候就是会报undefined function pcntl_fork(),找了很多方向都没有解决,要注意的一个点是PCNTL在 Windows 平台上不可用。

$pid = pcntl_fork();
if($pid == -1){
    file_put_contents(''testlog.log'',"\r\nFork Test",FILE_APPEND);
    return 1; //error
}
else if($pid){
    return 0; //success
}
else{   
    file_put_contents($log, ''Running...'', FILE_APPEND);
}

后来在stackoverflow上找到答案:

当使用Apache作为php服务器时,无法使用功能''pcntl_fork''模块(例如XAMPP)。您只能在CGI模式或命令行中使用pcntl_fork。

所以。。。把服务器换成nginx即可解决。

我们今天的关于PHP:pcntl_fork真的做什么?的分享就到这里,谢谢您的阅读,如果想了解更多关于p c php pcntl_fork和pcntl_fork 的用法、pcntl_fork和pcntl_fork 的用法、pcntl_fork安装以及实现PHP多进程、pcntl_fork()返回致命错误:调用未定义函数pcntl_fork()的相关信息,可以在本站进行搜索。

本文标签:

上一篇windbg在dll函数调用级别debuggingOutlook插件(dll函数调用失败怎么处理)

下一篇用于Windows / Visual Studio的最佳C ++ RPC库(微软visual c++运行时库)