共享中心套接字对象的PHP线程

共享中心套接字对象的PHP线程,php,multithreading,sockets,pthreads,Php,Multithreading,Sockets,Pthreads,我正在构建一个多线程PHPCLI应用程序,它通过套接字与服务器通信。其目的是让应用程序只创建一个与服务器的连接(通过一个单独的类),然后允许子线程使用已建立的套接字对象。以下代码失败: <?php /** * Test child class **/ class test extends Thread { private $server; public function __construct( &$server ) { $this->

我正在构建一个多线程PHPCLI应用程序,它通过套接字与服务器通信。其目的是让应用程序只创建一个与服务器的连接(通过一个单独的类),然后允许子线程使用已建立的套接字对象。以下代码失败:

<?php

/**
 * Test child class
 **/
class test extends Thread {

    private $server;

    public function __construct( &$server ) {
        $this->server = $server;
    }

    public function run() {
        echo $this->server->request( 'INFO 1-10' );
    }

}


/**
 * Socket class
 **/
class socket {

    private $socket;

    public function __construct( $host, $port ) {
        $this->socket = fsockopen( $host, $port, $errno, $errstr, 10 );
    }

    public function request( $out ) {
        fwrite( $this->socket, $out . "\r\n" );
        return fgets( $this->socket );
    }

}


/**
 * main class
 **/
class main {

    private $server;

    public function __construct() {
        $this->server = new socket( '192.168.1.141', 5250 );
    }

    public function main() {
        $test = new test( $this->server );
        $test->start();
    }

}

$main = new main();
$main->main();

?>
如果我删除线程特性,并使用以下代码:

<?php

/**
 * Test child class
 **/
class test {

    private $server;

    public function __construct( &$server ) {
        $this->server = $server;
    }

    public function run() {
        echo $this->server->request( 'INFO 1-10' );
    }

}


/**
 * Socket class
 **/
class socket {

    private $socket;

    public function __construct( $host, $port ) {
        $this->socket = fsockopen( $host, $port, $errno, $errstr, 10 );
    }

    public function request( $out ) {
        fwrite( $this->socket, $out . "\r\n" );
        return fgets( $this->socket );
    }

}


/**
 * main class
 **/
class main {

    private $server;

    public function __construct() {
        $this->server = new socket( '192.168.1.141', 5250 );
    }

    public function main() {
        $test = new test( $this->server );
        $test->run();
    }

}

$main = new main();
$main->main();

?>

此代码成功运行

似乎是通过引用将$server对象(socket类)传递给扩展线程的类导致了问题

我想知道是否有一种方法可以实现我最初的目标,即构建一个多线程PHPCLI应用程序,该应用程序通过单个套接字连接与服务器通信

谢谢你的帮助


最终的应用程序将更加健壮,允许动态生成线程。我上面提供的示例是显示根问题,而不是其他问题。

我更新了套接字类声明以扩展,现在它可以正常工作

<?php

/**
 * Test child class
 **/
class test extends Threaded {

    private $server;

    public function __construct( &$server ) {
        $this->server = $server;
    }

    public function run() {
        echo $this->server->request( 'INFO 1-10' );
    }

}


/**
 * Socket class
 **/
class socket extends Threaded {

    private $socket;

    public function __construct( $host, $port ) {
        $this->socket = fsockopen( $host, $port, $errno, $errstr, 10 );
    }

    public function request( $out ) {
        fwrite( $this->socket, $out . "\r\n" );
        return fgets( $this->socket );
    }

}


/**
 * main class
 **/
class main {

    private $server;

    public function __construct() {
        $this->server = new socket( '192.168.1.141', 5250 );
    }

    public function main() {
        $test = new test( $this->server );
        $test->run();
    }

}

$main = new main();
$main->main();

?>

<?php

/**
 * Test child class
 **/
class test extends Threaded {

    private $server;

    public function __construct( &$server ) {
        $this->server = $server;
    }

    public function run() {
        echo $this->server->request( 'INFO 1-10' );
    }

}


/**
 * Socket class
 **/
class socket extends Threaded {

    private $socket;

    public function __construct( $host, $port ) {
        $this->socket = fsockopen( $host, $port, $errno, $errstr, 10 );
    }

    public function request( $out ) {
        fwrite( $this->socket, $out . "\r\n" );
        return fgets( $this->socket );
    }

}


/**
 * main class
 **/
class main {

    private $server;

    public function __construct() {
        $this->server = new socket( '192.168.1.141', 5250 );
    }

    public function main() {
        $test = new test( $this->server );
        $test->run();
    }

}

$main = new main();
$main->main();

?>