• 进程通信

    进程通信

    在各个进程中,内存空间都是不一致的,各个变量都是在不同的内存空间,举个简单的例子

    用户A访问服务端,$_SESSION[‘user’]=1;用户B同时访问服务端,读取$_SESSION[‘user’]是读取不到的,因为进程之间内存不是相同的

    同样,在php多进程中,pcntl_fork之后,虽然能读取到之前的变量,但这个变量是复制出来的一份,和原来那份存储位置根本不同,例如:

    1. <?php
    2. $str = "EasySwoole\n";
    3. $pid = pcntl_fork();
    4. if($pid>0){
    5. $str="Tioncico\n";//在主进程修改了$str,不会影响到子进程的$str变量
    6. echo $str;
    7. }elseif ($pid==0){
    8. echo $str;//$str是pcntl_fork复制出来的
    9. }else{
    10. }

    所以,多进程中根本无法直接通信,那么,该怎么样才能通信呢?可以使用以下几种方式进行通信

    • 管道通信,分为有名管道,无名管道等,可自行搜索了解详细
    • 消息队列通信,使用linux消息队列,通过sysvmsg扩展,可查看:http://www.php20.cn/article/137
    • 进程信号通信,可查看:http://www.php20.cn/article/134
    • 共享内存通信,映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
    • 套接字通信
    • 第三方通信,使用文件操作,mysql,redis等方法也可实现通信

    可自行搜索了解详细内容