Rumah > pembangunan bahagian belakang > tutorial php > swoole - php多进程编程时如何共享变量?

swoole - php多进程编程时如何共享变量?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-08-04 09:22:13
asal
1773 orang telah melayarinya

我写了个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></code>
Salin selepas log masuk
Salin selepas log masuk

客户端的:

<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></code>
Salin selepas log masuk
Salin selepas log masuk

回复内容:

我写了个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></code>
Salin selepas log masuk
Salin selepas log masuk

客户端的:

<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></code>
Salin selepas log masuk
Salin selepas log masuk

memcacheredis之流即可搞定。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan