Клиент/сервер приложения на php

young

Новичок
Клиент/сервер приложения на php

Как-то ночью было мне грусно, а за пивом было идти лень, появился класс phpServerApp. Он позволяет создавать серверное приложение на php вот так:
PHP:
$server = new phpServerApp("localhost", "4443");
$server->run();
И все!
При коннекте он вызывает метод socketAction который можно предопределить, передавая ему Socket как параметр. Класс сам потом же его и закрывает!

Вопрос в том - востребованно ли это?!

Привожу сырец для оценки:

PHP:
<?

// +----------------------------------------------------------------------+ 
// PHP version 4.3.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 2003, youngST                                          |
// +----------------------------------------------------------------------+
// | Simple class allow to create PHP Server application.                 |
// | phpServerApp version 0.9 beta                                        |
// +----------------------------------------------------------------------+
// | Authors: Alexander Voytsekhovskyy <[email protected]>                 |
// +----------------------------------------------------------------------+

define ("DEVELOPER", "[email protected]");

class phpServerApp {

        var $host;
        var $port;
        var $run;
        var $delay;
        var $sock;

        function phpServerApp($host, $port, $delay = 1000) {
                $this->host = $host;
                $this->port = $port;
                $this->delay  = $delay;
                $this->run  = true;

                if (!in_array("pcntl", get_loaded_extensions())) {
                        echo "--enable--pnctl REQUIRED \n";
                }
                if (!in_array("sockets", get_loaded_extensions())) {
                        echo "--enable--sockets REQUIRED \n";
                }
                error_reporting (E_ALL); 
                set_error_handler(array($this, "errorReporter"));
                @set_time_limit (0); 

                $pid = @pcntl_fork();
                if ($pid == -1) {
                        trigger_error ("could not fork child process", E_USER_ERROR);
                } else if ($pid) {
                        exit(0);
                }
                if (!posix_setsid()) {
                        trigger_error ("could not detach from terminal", E_USER_ERROR);
                }
                pcntl_signal(SIGTERM, array($this, "sigHandler"));
                pcntl_signal(SIGHUP,  array($this, "sigHandler"));
                pcntl_signal(SIGUSR1, array($this, "sigHandler")); 

                if (($this->sock = @socket_create (AF_INET, SOCK_STREAM, 0)) < 0) { 
                        echo "socket_create() failed: reason: " . socket_strerror ($this->sock) . "\n"; exit(1);
                }
                if (($ret = @socket_bind ($this->sock, $this->host, $this->port)) < 0) { 
                        echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n"; exit(1);
                }
                if (($ret = @socket_listen ($this->sock, 5)) < 0) { 
                        echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n"; exit(1);
                }
        }

        function run() {
                while ($this->run) {
                        if (($msgsock = socket_accept($this->sock))) { 
                                $this->socketAction($msgsock);
                                socket_close ($msgsock);
                        }
                }
                usleep($this->delay);
                echo "Server shutdown \n";
        }

        function socketAction($msgsock) {
                $mess = "Socket here \n";
                socket_write ($msgsock, $mess, strlen ($mess));
        }

        function sigHandler ($signo) {
                switch($signo) {
                        case SIGTERM:
                                $this->run = 0;
                        break;
                default:
                                echo "Catch signal ".$signo."\n";
                        break;
                }
        }

        function errorReporter ($errno, $errstr, $errfile, $errline) { 
                switch ($errno) { 
                        case FATAL:
                                $message = '
                                        FATAL ['.$errno.'] '.$errstr.' in line '.$errline.' of file '.$errfile.'
                                        PHP '.PHP_VERSION.' ('.PHP_OS.')
                                ';
                                exit(1);
                        break;
                        default:
                                $message = 'Unkown error type: ['.$errno.'] '.$errstr;
                        break;
                }
        }

}

// Sapmle
$a = new phpServerApp("localhost", "1122");
$a->run();
?>
 

young

Новичок
Тебе надо проверить 100000 ссылок на корректность :)

Я применял тут :)
 

[DAN]

Старожил PHPClub
Я так понял, используя этот класс, можно сделать что-то типа web-service ?
Если да, не мог бы тв поподробнее расписать эту тему ?
 

cooler.com.ua

Guest
И где ж ты был раньше, когда я писал под свой чат демона :(
Пришлось написать на PERL'е, но не жалуюсь ... при 200 человеках в онлайне нагрузка на 766-й целерончик составляет около 40 % ...
 

kvn

programmer
При коннекте он вызывает метод socketAction который можно предопределить, передавая ему Socket как параметр. Класс сам потом же его и закрывает!
А пример такого использования можно?
 

Varg

Guest
young, ты опиши побольше частных случаев использования. Хотя вроде штучка неплоха :)
 

young

Новичок
Во многих заадачах самым узким местом является отклик удалнного сервера или скорость связи с ним. И при этом посылая 100 запросов мы получаем производительность в 100 раз болше - так как наш сервер может это пропустить, запросы к 100 разным машинам, и каждая из них в отдельности может это отработать.

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

А как использовать....

Просто создаешь экземпляр, и вызываешь run(); :)
 

Kasper

Guest
а вариант если ты закрыт проксей не учтен ?...
 

Yurik

/dev/null
http://www.innerfish.com/lxmpserver/
и в частности
http://www.innerfish.com/lxmpserver/sockets.phps

имеют очень схожую идею

Посмотреть как это для чата используется можно тут
 

Screjet

Новичок
PHP:
if (!posix_setsid()) { 
                        trigger_error ("could not detach from terminal", E_USER_ERROR); 
                }
а я думал вот этот кусок кода этим занимается
 

j0ker

Guest
У меня такая проблема.. есть доступ рут к серверу... (ну или смогу его получить без проблем) Как мне разблокировать -enable-pnctl ??
Если пути кроме перезборки ?? А если пересопирать как это сделать весьма окоруратно чтобы не пришлось все перенастраивать ??
 

young

Новичок
Компилируешь pnctl как отдельный so-модуль и подключаешь через dl()

Либо можно убрать пару строк кода, и все будет работать и без него :)
 

j0ker

Guest
Ну я так понял, сама фишка, в этом иесть, защет pnctl достигается много поточность.

>Компилируешь pnctl как отдельный so-модуль и подключаешь > через dl()
А где его можно качнуть не подскажешь?
И глянув мануал понял что и dl может быть заблокирован.. (как тогда ? )
 

young

Новичок
Ты же говоришь что у тебя root есть - разблокируй.

Он уже есть у тебя в дистрибутивах php

ext/pnclt/

Нет, многопоточность он не дает :) Он дает возможность коректно стартовать / останавливать демон. Тебе просто прийдется стартовать с & в конце и убивать их ручками :)

Многопоточность дает OS Linux
 

j0ker

Guest
C dl все ок.
Если не сложно скинь мне ПОЖАЛУЙСТО на
[email protected]

ext/pnclt/
а то я не могу найти. там чего то нет такого. И если не очень трудно скинь как so- мдуль.
 
Сверху