5 var $urlArr, $mMaxTitles;
7 function SquidUpdate( $urlArr = Array(), $maxTitles = false ) {
8 global $wgMaxSquidPurgeTitles;
9 if ( $maxTitles === false ) {
10 $this->mMaxTitles
= $wgMaxSquidPurgeTitles;
12 $this->mMaxTitles
= $maxTitles;
14 if ( count( $urlArr ) > $this->mMaxTitles
) {
15 $urlArr = array_slice( $urlArr, 0, $this->mMaxTitles
);
17 $this->urlArr
= $urlArr;
20 /* static */ function newFromLinksTo( &$title ) {
21 # Get a list of URLs linking to this page
22 $id = $title->getArticleID();
23 $sql = "SELECT cur_namespace,cur_title FROM links,cur WHERE l_to={$id} and l_from=cur_id" ;
24 $res = wfQuery ( $sql, DB_READ
) ;
25 $blurlArr = $title->getSquidURLs();
26 if ( wfNumRows( $res ) <= $this->mMaxTitles
) {
27 while ( $BL = wfFetchObject ( $res ) )
29 $tobj = Title
::makeTitle( $BL->cur_namespace
, $BL->cur_title
) ;
30 $blurlArr[] = $tobj->getInternalURL();
33 wfFreeResult ( $res ) ;
34 return new SquidUpdate( $blurlArr );
37 /* static */ function newFromBrokenLinksTo( &$title ) {
38 # Get a list of URLs linking to this (currently non-existent) page
39 $encTitle = $title->getPrefixedDBkey();
40 $sql = "SELECT cur_namespace,cur_title FROM brokenlinks,cur WHERE bl_to={$encTitle} AND bl_from=cur_id";
41 $res = wfQuery( $sql, DB_READ
);
43 if ( wfNumRows( $res ) <= $this->mMaxTitles
) {
44 while ( $BL = wfFetchObject( $res ) )
46 $tobj = Title
::makeTitle( $BL->cur_namespace
, $BL->cur_title
);
47 $blurlArr[] = $tobj->getInternalURL();
51 return new SquidUpdate( $blurlArr );
54 /* static */ function newSimplePurge( &$title ) {
55 $urlArr = $title->getSquidURLs();
56 return new SquidUpdate( $blurlArr );
60 SquidUpdate
::purge( $this->urlArr
);
63 /* Purges a list of Squids defined in $wgSquidServers.
64 $urlArr should contain the full URLs to purge as values
65 (example: $urlArr[] = 'http://my.host/something')
66 XXX report broken Squids per mail or log */
68 /* static */ function purge( $urlArr ) {
69 global $wgSquidServers;
71 if ( $wgSquidServers == "echo" ) {
72 echo implode("<br>\n", $urlArr);
76 $maxsocketspersquid = 8; // socket cap per Squid
77 $urlspersocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
78 $firsturl = $urlArr[0];
80 $urlArr = array_values($urlArr);
81 $sockspersq = max(ceil(count($urlArr) / $urlspersocket ),1);
82 if ($sockspersq == 1) {
83 /* the most common case */
84 $urlspersocket = count($urlArr);
85 } else if ($sockspersq > $maxsocketspersquid ) {
86 $urlspersocket = ceil(count($urlArr) / $maxsocketspersquid);
87 $sockspersq = $maxsocketspersquid;
89 $totalsockets = count($wgSquidServers) * $sockspersq;
92 /* this sets up the sockets and tests the first socket for each server. */
93 for ($ss=0;$ss < count($wgSquidServers);$ss++
) {
96 while ($so < $sockspersq && !$failed) {
98 /* first socket for this server, do the tests */
99 @list
($server, $port) = explode(':', $wgSquidServers[$ss]);
100 if(!isset($port)) $port = 80;
101 #$this->debug("Opening socket to $server:$port");
102 $socket = @fsockopen
($server, $port, $error, $errstr, 3);
106 $totalsockets -= $sockspersq;
108 $msg ="PURGE " . $firsturl . " HTTP/1.0\r\n".
109 "Connection: Keep-Alive\r\n\r\n";
111 @fputs
($socket,$msg);
112 #$this->debug("...");
113 $res = @fread
($socket,512);
115 /* Squid only returns http headers with 200 or 404 status,
116 if there's more returned something's wrong */
117 if (strlen($res) > 250) {
120 $totalsockets -= $sockspersq;
122 @stream_set_blocking
($socket,false);
123 $sockets[] = $socket;
127 /* open the remaining sockets for this server */
128 list($server, $port) = explode(':', $wgSquidServers[$ss]);
129 if(!isset($port)) $port = 80;
130 $sockets[] = @fsockopen
($server, $port, $error, $errstr, 2);
131 @stream_set_blocking
($sockets[$s],false);
137 if ($urlspersocket > 0) {
138 /* now do the heavy lifting. The fread() relies on Squid returning only the headers */
139 for ($r=0;$r < $urlspersocket;$r++
) {
140 for ($s=0;$s < $totalsockets;$s++
) {
144 while (strlen($res) < 100 && $esc < 200 ) {
145 $res .= @fread
($sockets[$s],512);
150 $urindex = $r +
$urlspersocket * ($s - $sockspersq * floor($s / $sockspersq));
151 $msg = "PURGE " . $urlArr[$urindex] . " HTTP/1.0\r\n".
152 "Connection: Keep-Alive\r\n\r\n";
154 @fputs
($sockets[$s],$msg);
159 #$this->debug("Reading response...");
160 foreach ($sockets as $socket) {
163 while (strlen($res) < 100 && $esc < 200 ) {
164 $res .= @fread
($socket,1024);
174 function debug( $text ) {
175 global $wgDebugSquid;
176 if ( $wgDebugSquid ) {