Потоки PHP, разделяющие центральный объект сокета

1

Я создаю многопоточное приложение PHP CLI, которое говорит с сервером через сокеты. Цель состоит в том, чтобы приложение только создавало одно соединение с сервером (через отдельный класс), а затем разрешало дочерним потокам использовать установленный объект сокета. Не удалось выполнить следующий код:

<?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 Warning:  fwrite() expects parameter 1 to be resource, integer given in /test_stackoverflow/test.sh on line 35
PHP Stack trace:
PHP   1. {main}() /test_stackoverflow/test.sh:0
PHP   2. socket->request() /test_stackoverflow/test.sh:17
PHP   3. fwrite() /test_stackoverflow/test.sh:35
PHP Warning:  fgets() expects parameter 1 to be resource, integer given in /test_stackoverflow/test.sh on line 36
PHP Stack trace:
PHP   1. {main}() /test_stackoverflow/test.sh:0
PHP   2. socket->request() /test_stackoverflow/test.sh:17
PHP   3. fgets() /test_stackoverflow/test.sh:36

Если я удалю аспект Thread и воспользуюсь следующим кодом:

<?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 (класс сокета) путем ссылки на класс, который расширяет Thread, вызывает проблему.

Мне было интересно, есть ли способ выполнить мою первоначальную цель создания многопоточного приложения CLI для PHP, которое говорит с сервером через одно соединение сокетов.

Спасибо за твою помощь!

Окончательное приложение будет гораздо более надежным, позволяя динамически создавать потоки. Пример, приведенный выше, заключается в отображении проблемы с корнем, и ничего больше.

Теги:
multithreading
sockets
pthreads

1 ответ

1
Лучший ответ

Я обновил объявление класса сокетов, чтобы расширить класс Threaded, и теперь он отлично работает.

<?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();

?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню