这篇文章主要围绕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)
- 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函数应该像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 的用法
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 的用法
这是两个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多进程
PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展,有时间在ubuntu下玩了下。
1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是
创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令
# 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