young
Новичок
Клиент/сервер приложения на php
Как-то ночью было мне грусно, а за пивом было идти лень, появился класс phpServerApp. Он позволяет создавать серверное приложение на php вот так:
И все!
При коннекте он вызывает метод socketAction который можно предопределить, передавая ему Socket как параметр. Класс сам потом же его и закрывает!
Вопрос в том - востребованно ли это?!
Привожу сырец для оценки:
Как-то ночью было мне грусно, а за пивом было идти лень, появился класс 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();
?>