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 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 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 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
00051
00052
00053
00054
00055 function
purge( $urlArr ) {
00056 global $wgSquidServers;
00057
00058
if ( $wgSquidServers ==
"echo" ) {
00059 echo implode(
"<br>\n", $urlArr);
00060
return;
00061 }
00062
00063 $maxsocketspersquid = 8;
00064 $urlspersocket = 400;
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
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
00080
for ($ss=0;$ss < count($wgSquidServers);$ss++) {
00081 $failed =
false;
00082 $so = 0;
00083
while ($so < $sockspersq && !$failed) {
00084
if ($so == 0) {
00085
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
00097
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
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
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 ?>