当前位置:首页 > CN2资讯 > 正文内容

PHP pcntl

12小时前CN2资讯

 

​​pcntl​​​是一个可以利用操作系统的​​fork​​​系统调用在PHP中实现多线程的进程控制扩展,当使用​​fork​​​系统调用后执行的代码将会是并行的。​​pcntl​​仅适用于Linux平台的CLI模式下使用。

PHP官方没有提供多线程的扩展,在​​pecl​​​中有一个​​pthread​​扩展提供了多线程的特性,此版本仅在线程安全版本中可用。

创建子进程​​pcntl_fork​​

int pcntl_fork(void)

当​​pcntl_fork​​函数执行时会在当前进程下创建一个子进程,子进程与父进程在PID和PPID上会不同。

子进程会复制父进程中所有的数据、代码、状态等信息。当使用​​pcntl_fork​​成功创建子进程后,子进程会复制父进程的代码和数据。此时父进程和子进程拥有相同的代码和数据。子进程也会复制父进程的状态。

当使用​​pcntl_fork​​​创建子进程,如果成功则会在父进程中将会返回0,在子进程中会返回自身的进程编号​​PID​​​。如果创建失败则返回​​-1​​。

使用​​pcntl_fork​​​创建的进程只是一个分支节点,相当于一个标记,父进程完成后子进程会从标记处继续执行,也就是说在​​pcntl_fork​​之后的代码分别会被父进程和子进程执行两遍,而两个进程在执行过程中得到的返回值却是不同的,因此才可以分离父子进程执行不同的代码。

在Linux环境下可使用​​ps​​命令查看进程

<?php
$pid = pcntl_fork();
if($pid > 0){
//父进程
exit(0);
}elseif($pid == 0){
//子进程
exit(0);
}

多进程和多线程的作用相同,区别主要在于

  • 多个线程是在同一个进程内的,线程之间可以共享内存变量而实现线程间的通信。
  • 线程比进程更加轻量级,进程要比线程更加消耗系统资源。

多线程存在的问题主要有

  • 线程读写变量存在着同步问题需要加锁
  • 锁粒度过大会存在性能问题,会导致只有一个线程在运行,其它线程都在等待锁,也就无法实现并行。
  • 同时使用多个锁时逻辑复杂,一旦某个锁没有被正确释放可能会发生线程死锁。
  • 某个线程发生致命错误会导致整个进程崩溃

相对而言多进程更为稳定,可利用进程间通信​​IPC​​技术实现数据共享。多进程通信的方式主要包括

  • 共享内存
    共享内存和线程间读写变量时一样的,都需要加锁,同时也存在同步、死锁等问题。
  • 消息队列
    消息队列采用多个子进程抢占队列的模式,性能较好。
  • 管道、UnixSock、TCP、UDP
    可以使用​​​read/write​​来传递数据,TCP/UDP使用socket来通信,子进程可以分布运行。

利用​​fork​​​系统调用可以实现并发的TCP服务器,主进程​​accept​​​客户端连接。当有新的连接到来时直接​​fork​​​一个子进程,子进程中循环​​recv/send​​处理数据。这种模式在请求量不多的情况下很实用,例如FTP服务器。

在过去多数Linux程序都时采用这种模式,简单高效,代码量少。当有几百个并发的情况下表现不错,但在大并发的情况下消耗就会过大。

例如:每个子进程都能创建一个与之对应的文件,父进程也创建一个属于自己的文件。

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
if($socket < 0){
$errmsg = socket_strerror($socket);
echo "failed to create socket: {$errmsg}".PHP_EOL;
exit;
}

$host = "0.0.0.0";
$port = 9601;
$ret = socket_bind($socket, $host, $port);
if($ret < 0){
echo "failed to bind socket: {$ret}".PHP_EOL;
exit;
}

$ret = socket_listen($socket, 0);
if($ret < 0){
$errmsg = socket_strerror($ret);
echo "failed to listen: {$errmsg}".PHP_EOL;
exit;
}

while(pcntl_fork() == 0){
$connection = @socket_accept($socket);
if(pcntl_fork() == 0){
$recv = socket_read($connection ,8192);
$data = "serverr: {$recv}";

socket_write($connection ,$data);
socket_close($connection);
exit(0);
}else{
socket_close($connection);
}
}

   



    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/26216.html

    标签: PHPpcntl
    分享给朋友:

    “PHP pcntl” 的相关文章

    全面提升VPS性能测试与优化方法指南

    VPS性能测试概述 在使用VPS的过程中,了解它的性能测试显得尤为重要。VPS性能测试是一种评估虚拟专用服务器性能的手段,可以帮助我们清晰地了解VPS的状态与能力。这项测试不仅关注CPU型号、内存大小等硬件配置,还涵盖了磁盘存储量、操作系统版本以及虚拟化程序等多个方面的检测。通过这些参数,我们能对V...

    如何选择国内免费服务器?全面指南与推荐

    国内免费服务器概述 在当今数字化快速发展的时代,云计算的普及正以前所未有的速度改变着我们的工作和生活方式。国内云服务器市场也随着这股潮流不断壮大,越来越多的云服务提供商进入市场,尝试用优惠的价格吸引用户。尤其是对于那些刚起步的开发者和小型企业而言,国内免费服务器的出现无疑为他们提供了一个很好的机会。...

    选择Cogent VPS的理由:稳定性、灵活性与优质支持

    谈到虚拟专用服务器(VPS),我想很多人可能会对这个概念产生好奇。VPS是一种将物理服务器分割成多个虚拟服务器的技术。每个VPS都有独立的操作系统和资源,这与共享主机有很大不同。共享主机的用户资源是共用的,而VPS用户则有更多的控制权和灵活性。这种架构使得VPS成为中小企业和开发者的理想选择。 接下...

    VPS测速:优化服务器性能与用户体验的关键工具

    当谈到网络服务时,VPS(虚拟专用服务器)是一个绕不开的话题。它为用户提供了一个灵活且高效的网络环境,通过虚拟化技术将一台物理服务器分割成多个独立的虚拟服务器。用户可以拥有自己的操作系统、存储空间和带宽,这使得VPS成为了许多企业和个人的理想选择。 通过使用VPS,用户能够执行各种任务,比如搭建网站...

    JUHOST云计算与服务器托管解决方案详解

    JUHOST的定义和背景 JUHOST,是一家专注于提供服务器托管和云计算解决方案的公司。由于近年来信息技术的快速发展,云服务的需求不断上升,JUHOST应运而生。它致力于为企业及个人用户提供高效、稳定的服务器支持。作为行业内的后起之秀,JUHOST凭借着优质的技术和服务,迅速赢得了用户的信赖。 我...

    IPv6测速全攻略:提升网络性能的实用指南

    IPv6测试的主题引起了越来越多人的关注。IPv6,即互联网协议第六版,是一种新的网络协议,旨在替代IPv4,解决了IPv4地址耗尽的问题。随着互联网的迅猛发展,网络设备和用户的数量不断增长,IPv4所能提供的有限地址空间已经无法满足需求。这使得IPv6的推广和使用变得至关重要。 为什么我们需要进行...