Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members | Related Pages

SquidUpdate.php

Go to the documentation of this file.
00001 <?php 00002 # See deferred.doc 00003 00004 class SquidUpdate { 00005 var $urlArr; 00006 00007 function SquidUpdate( $urlArr = Array() ) { 00008 $this->urlArr = $urlArr; 00009 } 00010 00011 /* static */ function newFromLinksTo( &$title ) { 00012 # Get a list of URLs linking to this page 00013 $id = $title->getArticleID(); 00014 $sql = "SELECT cur_namespace,cur_title FROM links,cur WHERE l_to={$id} and l_from=cur_id" ; 00015 $res = wfQuery ( $sql, DB_READ ) ; 00016 $blurlArr = $title->getSquidURLs(); 00017 while ( $BL = wfFetchObject ( $res ) ) 00018 { 00019 $tobj = Title::makeTitle( $BL->cur_namespace, $BL->cur_title ) ; 00020 $blurlArr[] = $tobj->getInternalURL(); 00021 } 00022 wfFreeResult ( $res ) ; 00023 return new SquidUpdate( $blurlArr ); 00024 } 00025 00026 /* static */ function newFromBrokenLinksTo( &$title ) { 00027 # Get a list of URLs linking to this (currently non-existent) page 00028 $encTitle = $title->getPrefixedDBkey(); 00029 $sql = "SELECT cur_namespace,cur_title FROM brokenlinks,cur WHERE bl_to={$encTitle} AND bl_from=cur_id"; 00030 $res = wfQuery( $sql, DB_READ ); 00031 $blurlArr = array(); 00032 while ( $BL = wfFetchObject( $res ) ) 00033 { 00034 $tobj = Title::makeTitle( $BL->cur_namespace, $BL->cur_title ); 00035 $blurlArr[] = $tobj->getInternalURL(); 00036 } 00037 wfFreeResult( $res ); 00038 return new SquidUpdate( $blurlArr ); 00039 } 00040 00041 /* static */ function newSimplePurge( &$title ) { 00042 $urlArr = $title->getSquidURLs(); 00043 return new SquidUpdate( $blurlArr ); 00044 } 00045 00046 function doUpdate() { 00047 SquidUpdate::purge( $this->urlArr ); 00048 } 00049 00050 /* Purges a list of Squids defined in $wgSquidServers. 00051 $urlArr should contain the full URLs to purge as values 00052 (example: $urlArr[] = 'http://my.host/something') 00053 XXX report broken Squids per mail or log */ 00054 00055 /* static */ function purge( $urlArr ) { 00056 global $wgSquidServers; 00057 00058 if ( $wgSquidServers == "echo" ) { 00059 echo implode("<br>\n", $urlArr); 00060 return; 00061 } 00062 00063 $maxsocketspersquid = 8; // socket cap per Squid 00064 $urlspersocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while 00065 $firsturl = $urlArr[0]; 00066 unset($urlArr[0]); 00067 $urlArr = array_values($urlArr); 00068 $sockspersq = max(ceil(count($urlArr) / $urlspersocket ),1); 00069 if ($sockspersq == 1) { 00070 /* the most common case */ 00071 $urlspersocket = count($urlArr); 00072 } else if ($sockspersq > $maxsocketspersquid ) { 00073 $urlspersocket = ceil(count($urlArr) / $maxsocketspersquid); 00074 $sockspersq = $maxsocketspersquid; 00075 } 00076 $totalsockets = count($wgSquidServers) * $sockspersq; 00077 $sockets = Array(); 00078 00079 /* this sets up the sockets and tests the first socket for each server. */ 00080 for ($ss=0;$ss < count($wgSquidServers);$ss++) { 00081 $failed = false; 00082 $so = 0; 00083 while ($so < $sockspersq && !$failed) { 00084 if ($so == 0) { 00085 /* first socket for this server, do the tests */ 00086 @list($server, $port) = explode(':', $wgSquidServers[$ss]); 00087 if(!isset($port)) $port = 80; 00088 $socket = @fsockopen($server, $port, $error, $errstr, 3); 00089 if (!$socket) { 00090 $failed = true; 00091 $totalsockets -= $sockspersq; 00092 } else { 00093 @fputs($socket,"PURGE " . $firsturl . " HTTP/1.0\r\n". 00094 "Connection: Keep-Alive\r\n\r\n"); 00095 $res = @fread($socket,512); 00096 /* Squid only returns http headers with 200 or 404 status, 00097 if there's more returned something's wrong */ 00098 if (strlen($res) > 250) { 00099 fclose($socket); 00100 $failed = true; 00101 $totalsockets -= $sockspersq; 00102 } else { 00103 @stream_set_blocking($socket,false); 00104 $sockets[] = $socket; 00105 } 00106 } 00107 } else { 00108 /* open the remaining sockets for this server */ 00109 list($server, $port) = explode(':', $wgSquidServers[$ss]); 00110 if(!isset($port)) $port = 80; 00111 $sockets[] = @fsockopen($server, $port, $error, $errstr, 2); 00112 @stream_set_blocking($sockets[$s],false); 00113 } 00114 $so++; 00115 } 00116 } 00117 00118 if ($urlspersocket > 0) { 00119 /* now do the heavy lifting. The fread() relies on Squid returning only the headers */ 00120 for ($r=0;$r < $urlspersocket;$r++) { 00121 for ($s=0;$s < $totalsockets;$s++) { 00122 if($r != 0) { 00123 $res = ''; 00124 $esc = 0; 00125 while (strlen($res) < 100 && $esc < 200 ) { 00126 $res .= @fread($sockets[$s],512); 00127 $esc++; 00128 usleep(20); 00129 } 00130 } 00131 $urindex = $r + $urlspersocket * ($s - $sockspersq * floor($s / $sockspersq)); 00132 @fputs($sockets[$s],"PURGE " . $urlArr[$urindex] . " HTTP/1.0\r\n". 00133 "Connection: Keep-Alive\r\n\r\n"); 00134 } 00135 } 00136 } 00137 00138 foreach ($sockets as $socket) { 00139 $res = ''; 00140 $esc = 0; 00141 while (strlen($res) < 100 && $esc < 200 ) { 00142 $res .= @fread($socket,1024); 00143 $esc++; 00144 usleep(20); 00145 } 00146 00147 @fclose($socket); 00148 } 00149 } 00150 } 00151 ?>

Generated on Tue Jun 29 23:40:07 2004 for Mediawiki by doxygen 1.3.7