{"id":259,"date":"2016-02-21T13:46:04","date_gmt":"2016-02-21T13:46:04","guid":{"rendered":"https:\/\/www.kolkataonweb.com\/code-bank\/?p=259"},"modified":"2016-07-18T21:35:06","modified_gmt":"2016-07-18T20:35:06","slug":"php-socket-server-running-as-daemon-and-multiple-connections","status":"publish","type":"post","link":"https:\/\/www.kolkataonweb.com\/code-bank\/php\/php-socket-server-running-as-daemon-and-multiple-connections\/","title":{"rendered":"PHP Socket Server &#8211; Running as Daemon and Multiple Connections"},"content":{"rendered":"<p>Code Courtesy: <a class=\"name\" href=\"http:\/\/php.net\/manual\/en\/function.socket-accept.php#80691\"><strong class=\"user\"><em>lars at opdenkamp dot eu<\/em><\/strong><\/a><\/p>\n<p>A socket server written in PHP. This can accept multiple connections and runs as a daemon.<\/p>\n<p><span style=\"color: #0000ff;\">pcntl_fork() <\/span>is thing here that is making this all possible. <span style=\"color: #0000ff;\"><strong><br \/>\n<\/strong><\/span><\/p>\n<blockquote>\n<pre class='wp-code-highlight prettyprint'><span style=\"color: #333333;\">&lt;?php\r\n\/**\r\n  * Listens for requests and forks on each connection\r\n  *\/\r\n\r\n$__server_listening = true;\r\n\r\n\/\/error_reporting(E_ALL);\r\nset_time_limit(0);\r\nob_implicit_flush();\r\ndeclare(ticks = 1);\r\n\r\nbecome_daemon();\r\n\r\n\/* nobody\/nogroup, change to your host's uid\/gid of the non-priv user *\/\r\nchange_identity(1000, 1000);\r\n\r\n\/* handle signals *\/\r\npcntl_signal(SIGTERM, 'sig_handler');\r\npcntl_signal(SIGINT, 'sig_handler');\r\npcntl_signal(SIGCHLD, 'sig_handler');\r\n\r\n\/* change this to your own host \/ port *\/\r\nserver_loop(\"192.168.0.1\", 1250);\r\n\r\n\/**\r\n  * Change the identity to a non-priv user\r\n  *\/\r\nfunction change_identity( $uid, $gid )\r\n{\r\n    if( !posix_setgid( $gid ) )\r\n    {\r\n        print \"Unable to setgid to \" . $gid . \"!\\n\";\r\n        exit;\r\n    }\r\n\r\n    if( !posix_setuid( $uid ) )\r\n    {\r\n        print \"Unable to setuid to \" . $uid . \"!\\n\";\r\n        exit;\r\n    }\r\n}\r\n\r\n\/**\r\n  * Creates a server socket and listens for incoming client connections\r\n  * @param string $address The address to listen on\r\n  * @param int $port The port to listen on\r\n  *\/\r\nfunction server_loop($address, $port)\r\n{\r\n    GLOBAL $__server_listening;\r\n\r\n    if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) &lt; 0)\r\n    {\r\n        echo \"failed to create socket: \".socket_strerror($sock).\"\\n\";\r\n        exit();\r\n    }\r\n\r\n    if(($ret = socket_bind($sock, $address, $port)) &lt; 0)\r\n    {\r\n        echo \"failed to bind socket: \".socket_strerror($ret).\"\\n\";\r\n        exit();\r\n    }\r\n\r\n    if( ( $ret = socket_listen( $sock, 0 ) ) &lt; 0 )\r\n    {\r\n        echo \"failed to listen to socket: \".socket_strerror($ret).\"\\n\";\r\n        exit();\r\n    }\r\n\r\n    socket_set_nonblock($sock);\r\n   \r\n    echo \"waiting for clients to connect\\n\";\r\n\r\n    while ($__server_listening)\r\n    {\r\n        $connection = @socket_accept($sock);\r\n        if ($connection === false)\r\n        {\r\n            usleep(100);\r\n        }elseif ($connection &gt; 0)\r\n        {\r\n            handle_client($sock, $connection);\r\n        }else\r\n        {\r\n            echo \"error: \".socket_strerror($connection);\r\n            die;\r\n        }\r\n    }\r\n}\r\n\r\n\/**\r\n  * Signal handler\r\n  *\/\r\nfunction sig_handler($sig)\r\n{\r\n    switch($sig)\r\n    {\r\n        case SIGTERM:\r\n        case SIGINT:\r\n            exit();\r\n        break;\r\n\r\n        case SIGCHLD:\r\n            pcntl_waitpid(-1, $status);\r\n        break;\r\n    }\r\n}\r\n\r\n\/**\r\n  * Handle a new client connection\r\n  *\/\r\nfunction handle_client($ssock, $csock)\r\n{\r\n    GLOBAL $__server_listening;\r\n\r\n    $pid = <strong>pcntl_fork();<\/strong>\r\n\r\n    if ($pid == -1)\r\n    {\r\n        \/* fork failed *\/\r\n        echo \"fork failure!\\n\";\r\n        die;\r\n    }elseif ($pid == 0)\r\n    {\r\n        \/* child process *\/\r\n        $__server_listening = false;\r\n        socket_close($ssock);\r\n        interact($csock);\r\n        socket_close($csock);\r\n    }else\r\n    {\r\n        socket_close($csock);\r\n    }\r\n}\r\n\r\nfunction interact($socket)\r\n{\r\n    $conn = mysql_connect(\"localhost\",\"xxxxxxxx\",\"xxxxxxxxxxx\");\r\n    if(!$conn)\r\n    {\r\n        echo \"Error: failed to connect DB\";\r\n        die();\r\n    }\r\n    \r\n    if(!mysql_select_db(\"xxxxxxxx\",$conn))\r\n    {\r\n        echo \"Error: failed to connect DB\";\r\n        die();\r\n    }\r\n    \r\n    \/\/ read client input\r\n    $input = socket_read($socket, 1024, PHP_NORMAL_READ);\r\n    \r\n    $buff = explode(\"|\",$input);\r\n    $len = count($buff);\r\n    $temp = explode(\"=\",$buff[0]);\r\n    $temp[1] = intval($temp[1]);\r\n    if($temp[0]!=\"action\" &amp;&amp; ($temp[1]!=1 || $temp[1]!=2 ))  \/\/1=read 2=write -- these are just random numbers and has no other significance.\r\n    {\r\n        $output = \"Error\\r\\n\";\r\n    } \r\n\r\n    \r\n    if($temp[1] == 1)\r\n    {\r\n        $result = mysql_query(\"select * from led_status\");\r\n        $rows = mysql_fetch_array($result);\r\n        $output = \"led_1=\".$rows['led_1'].\"|led_2=\".$rows['led_2'].\"\\r\\n\";\r\n    }\r\n\r\n    if($temp[1] == 2)\r\n    {\r\n        $queryW = \"insert into weather set \";\r\n        $queryL = \"update led_status set \";\r\n\r\n        for($i=1; $i&lt;$len; $i++)\r\n        {\r\n            $temp = explode(\"=\",$buff[$i]);\r\n            switch($temp[0])\r\n            {\r\n                   case 'temp':\r\n                    $queryW .= \"temperature=\" . floatval($temp[1]).\", \";\r\n                break;\r\n                \r\n                case 'paH':\r\n                    $queryW .= \"paH=\" . floatval($temp[1]) .\", \";    \r\n                break;\r\n                \r\n                case 'paM':\r\n                    $queryW .= \"paM=\" . floatval($temp[1]).\", \";\r\n                break;\r\n                \r\n                case 'led_1':\r\n                    $queryL .= \"led_1\" . floatval($temp[1]) .\", \";    \r\n                break;\r\n                \r\n                case 'led_2':\r\n                    $queryL .= \"led_2=\" . float_val($temp[1]).\", \";        \r\n            }\r\n        }        \r\n        \r\n        $queryW .= \" time=\".time();\r\n        $queryL .= \" time=\".time();\r\n        \r\n        mysql_query($queryL);\r\n        mysql_query($queryW);\r\n        \r\n        $output = \"Update Success\\r\\n\";\r\n    }\r\n            \r\n    \/* TALK TO YOUR CLIENT *\/ \r\n    socket_write($socket,$output, strlen($output));    \r\n    mysql_close();\r\n}\r\n\r\n\/**\r\n  * Become a daemon by forking and closing the parent\r\n  *\/\r\nfunction become_daemon()\r\n{\r\n    $pid = <strong>pcntl_fork()<\/strong>;\r\n   \r\n    if ($pid == -1)\r\n    {\r\n        \/* fork failed *\/\r\n        echo \"fork failure!\\n\";\r\n        exit();\r\n    }elseif ($pid)\r\n    {\r\n        \/* close the parent *\/\r\n        exit();\r\n    }else\r\n    {\r\n        \/* child becomes our daemon *\/\r\n        posix_setsid();\r\n        chdir('\/');\r\n        umask(0);\r\n        return posix_getpid();\r\n\r\n    }\r\n}\r\n?&gt;<\/span><\/pre>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Code Courtesy: lars at opdenkamp dot eu A socket server written in PHP. This can accept multiple connections and runs as a daemon. pcntl_fork() is thing here that is making this all possible. &lt;?php \/** * Listens for requests and forks on each connection *\/ $__server_listening = true; \/\/error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); declare(ticks = 1); become_daemon();&hellip; <a class=\"more-link\" href=\"https:\/\/www.kolkataonweb.com\/code-bank\/php\/php-socket-server-running-as-daemon-and-multiple-connections\/\">Continue reading <span class=\"screen-reader-text\">PHP Socket Server &#8211; Running as Daemon and Multiple Connections<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[24,25,27],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-php","tag-php-socket","tag-socket","tag-socket-server","entry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/comments?post=259"}],"version-history":[{"count":2,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/259\/revisions"}],"predecessor-version":[{"id":451,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/posts\/259\/revisions\/451"}],"wp:attachment":[{"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/media?parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/categories?post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kolkataonweb.com\/code-bank\/wp-json\/wp\/v2\/tags?post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}