X-Git-Url: http://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=web%2Fspush%2Fbrisk-spush.php;h=a811a2902f3283c58aa616cac8380084a405a4ca;hb=8c1df4ebf55f715144a422cdb4be7eee48f1b5d2;hp=fff12a007ff1f554debb9b6c5977547a8207f91d;hpb=8428f5186e50b2b390c95ace8870de516b79061e;p=brisk.git diff --git a/web/spush/brisk-spush.php b/web/spush/brisk-spush.php index fff12a0..a811a29 100755 --- a/web/spush/brisk-spush.php +++ b/web/spush/brisk-spush.php @@ -22,16 +22,25 @@ * Suite 330, Boston, MA 02111-1307, USA. * * TODO - * index_wr.php::chat - * index_wr.php::reload - * index_wr.php::exit * - * setcookie (for tables only) - * keepalive - * chunked - * BUG - after restart index_rd.php receive from prev clients a lot of req + * - partial write for normal page management + * - log legal address fix + * - from room to table + * - from table to room + * - fwrite other issues + * - manage and test cross forwarder between table and room + * - setcookie (for tables only) + * - keepalive management + * - chunked + * * DONE/FROZEN - problema con getpeer (HOSTADDR) * + * DONE - index_rd_ifra: last_clean issue + * DONE - fwrite failed error management (select, buffer where store unsent data, and fwrite check and retry) + * ABRT - index_wr.php::reload - reload is js-only function + * DONE - bug: after restart index_rd.php receive from prev clients a lot of req + * DONE - index_wr.php::chat + * DONE - index_wr.php::exit * DONE - index_rd.php porting * DONE - generic var management from internet * DONE - index.php auth part @@ -113,6 +122,7 @@ function main() } $s2u = array(); + $pages_flush = array(); $rndstr = ""; for ($i = 0 ; $i < 4096 ; $i++) { @@ -137,7 +147,7 @@ function main() while ($main_loop) { $curtime = time(); - printf("IN LOOP: Current opened: %d\n", count($socks)); + printf("IN LOOP: Current opened: %d pages_flush: %d\n", count($socks), count($pages_flush)); /* Prepare the read array */ if ($shutdown) @@ -151,7 +161,7 @@ function main() } $write = NULL; $except = NULL; - $num_changed_sockets = stream_select($read, $write, $except, 1); // 0, 250000); + $num_changed_sockets = stream_select($read, $write, $except, 0, 250000); if ($num_changed_sockets === FALSE) { printf("No data in 5 secs"); @@ -163,6 +173,11 @@ function main() } /* At least at one of the sockets something interesting happened */ foreach ($read as $i => $sock) { + /* is_resource check is required because there is the possibility that + during new request an old connection is closed */ + if (!is_resource($sock)) { + continue; + } if ($sock === $list) { printf("NUOVA CONNEX\n"); $new_unix = stream_socket_accept($list); @@ -172,6 +187,7 @@ function main() $post = array(); $cookie = array(); if (($new_socket = ancillary_getstream($new_unix, $stream_info)) !== FALSE) { + stream_set_blocking($new_socket, $blocking_mode); // Set the stream to non-blocking printf("RECEIVED HEADER:\n%s", $stream_info); $path = spu_process_info($stream_info, $method, $header, $get, $post, $cookie); printf("PATH: [%s]\n", $path); @@ -194,9 +210,14 @@ function main() index_main($room, $header_out, $addr, $get, $post, $cookie); $content = ob_get_contents(); ob_end_clean(); - // printf("OUT: [%s]\n", $G_content); - fwrite($new_socket, headers_render($header_out).$content); - fclose($new_socket); + + $pgflush = new PageFlush($new_socket, $curtime, 20, $header_out, $content); + + if ($pgflush->try_flush($curtime) == FALSE) { + // Add $pgflush to the pgflush array + array_push($pages_flush, $pgflush); + } + break; case SITE_PREFIX."index_wr.php": $header_out = array(); @@ -215,25 +236,26 @@ function main() break; case SITE_PREFIX."index_rd_ifra.php": do { - if (!isset($cookie['sess'])) { - fclose($new_socket); - break; - } - if (($user = $room->get_user($cookie['sess'], $idx)) == FALSE) { + $header_out = array(); + if (!isset($cookie['sess']) + || (($user = $room->get_user($cookie['sess'], $idx)) == FALSE)) { + $body = index_rd_ifra_fini(TRUE); + fwrite($new_socket, headers_render($header_out).$body); + fflush($new_socket); fclose($new_socket); break; } + // close a previous opened index_read_ifra socket, if exists if (($prev = $user->rd_socket_get()) != NULL) { unset($s2u[intval($user->rd_socket_get())]); unset($socks[intval($user->rd_socket_get())]); fclose($user->rd_socket_get()); + printf("CLOSE AND OPEN AGAIN ON IFRA2\n"); $user->rd_socket_set(NULL); } - $header_out = array(); $body = ""; index_rd_ifra_init($room, $user, $header_out, $body, $get, $post, $cookie); - stream_set_blocking($new_socket, $blocking_mode); // Set the stream to non-blocking fwrite($new_socket, headers_render($header_out).$body); fflush($new_socket); @@ -269,6 +291,7 @@ function main() unset($socks[intval($sock)]); unset($s2u[intval($sock)]); fclose($sock); + printf("CLOSE ON READ\n"); } if ($debug > 1) { printf("post unset\n"); @@ -295,25 +318,36 @@ function main() } - + foreach ($pages_flush as $k => $pgflush) { + if ($pgflush->try_flush($curtime) == TRUE) { + unset($pages_flush[$k]); + } + } foreach ($socks as $k => $sock) { if (isset($s2u[intval($sock)])) { - $body = ""; - - - $body = ""; $user = $room->user[$s2u[intval($sock)]]; - index_rd_ifra_main($room, $user, $body); - if ($body == "" && $user->rd_tout_is_expired($curtime)) { + $body = $user->rd_cache_get(); + if ($body == "") + index_rd_ifra_main($room, $user, $body); + + if ($body == "" && $user->rd_kalive_is_expired($curtime)) { $body = index_rd_ifra_keepalive($user); } if ($body != "") { echo "SPIA: [".substr($body, 0, 60)."...]\n"; - fwrite($sock, $body); + $body_l = mb_strlen($body, "ASCII"); + $ret = @fwrite($sock, $body); + if ($ret < $body_l) { + printf("TROUBLE WITH FWRITE: %d\n", $ret); + $user->rd_cache_set(mb_substr($body, $ret, $body_l - $ret, "ASCII")); + } + else { + $user->rd_cache_set(""); + } fflush($sock); - $user->rd_tout_reset($curtime); + $user->rd_kalive_reset($curtime); } // close socket after a while to prevent client memory consumption @@ -325,6 +359,7 @@ function main() unset($socks[intval($sock)]); unset($s2u[intval($sock)]); fclose($sock); + printf("CLOSE ON LOOP\n"); } } }