swoole - How to share variables during php multi-process programming?

WBOY
Release: 2016-08-04 09:22:13
Original
1628 people have browsed it

我写了个socket server,需要能共享父进程的$gsocks给子进程,但好像不能做到,我应该怎么做才能共享变量?

补充,额,memcache或者redis存的是字符串之类的把,我如何共享我问题代码中的socket res句柄?

代码如下:

服务端的:

<code><?php

$gsocks = array();


$pid = pcntl_fork();

switch ($pid) {
    case -1:
        #fail
        break;

    case 0:
        for(;;){
            sleep(1);
            echo "C";
            var_dump($gsocks);###     这里一直输出空数组,那么应该如何共享内存呢?
            if (count($gsocks) == 0) continue;
            
            $gsock = $gsocks[rand(0,count($gsocks)-1)];
            $msg = time()." You are a lucky man \n";
            socket_write($gsock, $msg, strlen($msg));
        }
        #i am child
        break;

    default:
        //确保在连接客户端时不会超时
        set_time_limit(0);
        //设置IP和端口号
        $address = "127.0.0.1";
        $port = 2046; //调试的时候,可以多换端口来测试程序!
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //阻塞模式
        socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //绑定到socket端口
        $result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //开始监听
        $result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        do { // never stop the daemon
            //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
            $msgsock = socket_accept($sock) or  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");

            //读取客户端数据
            //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
            $buf = socket_read($msgsock, 8192);
//            echo "Received msg: $buf   \n";

            //数据传送 向客户端写入返回结果
            $msg = "welcome \n";
            socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
            //一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止

            $gsocks[] = $msgsock;

            if ($buf == "stop") {
                break;
            }

        } while (true);

        foreach ($gsocks as $gsock) {
            socket_close($gsock);
        }

        socket_close($sock);
    #parent
}


</code>
Copy after login
Copy after login

客户端的:

<code><?php  
/** 
 * File name:client.php 
 * 客户端代码 
 *  
 * @author guisu.huang 
 * @since 2012-04-11 
 */  
set_time_limit(0);  
  
$host = "127.0.0.1";  
$port = 2046;  
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create  socket\n"); // 创建一个Socket  
   
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");    //  连接  
socket_write($socket, "hello socket") or die("Write failed\n"); // 数据传送 向服务器发送消息  
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {  
    echo("Response was:" . $buff . "\n");  
}  
socket_close($socket);  </code>
Copy after login
Copy after login

回复内容:

我写了个socket server,需要能共享父进程的$gsocks给子进程,但好像不能做到,我应该怎么做才能共享变量?

补充,额,memcache或者redis存的是字符串之类的把,我如何共享我问题代码中的socket res句柄?

代码如下:

服务端的:

<code><?php

$gsocks = array();


$pid = pcntl_fork();

switch ($pid) {
    case -1:
        #fail
        break;

    case 0:
        for(;;){
            sleep(1);
            echo "C";
            var_dump($gsocks);###     这里一直输出空数组,那么应该如何共享内存呢?
            if (count($gsocks) == 0) continue;
            
            $gsock = $gsocks[rand(0,count($gsocks)-1)];
            $msg = time()." You are a lucky man \n";
            socket_write($gsock, $msg, strlen($msg));
        }
        #i am child
        break;

    default:
        //确保在连接客户端时不会超时
        set_time_limit(0);
        //设置IP和端口号
        $address = "127.0.0.1";
        $port = 2046; //调试的时候,可以多换端口来测试程序!
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //阻塞模式
        socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //绑定到socket端口
        $result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        //开始监听
        $result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");
        do { // never stop the daemon
            //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
            $msgsock = socket_accept($sock) or  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");

            //读取客户端数据
            //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
            $buf = socket_read($msgsock, 8192);
//            echo "Received msg: $buf   \n";

            //数据传送 向客户端写入返回结果
            $msg = "welcome \n";
            socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
            //一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止

            $gsocks[] = $msgsock;

            if ($buf == "stop") {
                break;
            }

        } while (true);

        foreach ($gsocks as $gsock) {
            socket_close($gsock);
        }

        socket_close($sock);
    #parent
}


</code>
Copy after login
Copy after login

客户端的:

<code><?php  
/** 
 * File name:client.php 
 * 客户端代码 
 *  
 * @author guisu.huang 
 * @since 2012-04-11 
 */  
set_time_limit(0);  
  
$host = "127.0.0.1";  
$port = 2046;  
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create  socket\n"); // 创建一个Socket  
   
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");    //  连接  
socket_write($socket, "hello socket") or die("Write failed\n"); // 数据传送 向服务器发送消息  
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {  
    echo("Response was:" . $buff . "\n");  
}  
socket_close($socket);  </code>
Copy after login
Copy after login

memcacheredis之流即可搞定。

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template