MediaWiki REL1_34
SquidPurgeClientPool.php
Go to the documentation of this file.
1<?php
24 protected $clients = [];
25
27 protected $timeout = 5;
28
32 function __construct( $options = [] ) {
33 if ( isset( $options['timeout'] ) ) {
34 $this->timeout = $options['timeout'];
35 }
36 }
37
42 public function addClient( $client ) {
43 $this->clients[] = $client;
44 }
45
46 public function run() {
47 $done = false;
48 $startTime = microtime( true );
49
50 while ( !$done ) {
51 $readSockets = $writeSockets = [];
52 foreach ( $this->clients as $clientIndex => $client ) {
53 $sockets = $client->getReadSocketsForSelect();
54 foreach ( $sockets as $i => $socket ) {
55 $readSockets["$clientIndex/$i"] = $socket;
56 }
57 $sockets = $client->getWriteSocketsForSelect();
58 foreach ( $sockets as $i => $socket ) {
59 $writeSockets["$clientIndex/$i"] = $socket;
60 }
61 }
62 if ( $readSockets === [] && $writeSockets === [] ) {
63 break;
64 }
65
66 $exceptSockets = null;
67 $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
68 Wikimedia\suppressWarnings();
69 $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
70 Wikimedia\restoreWarnings();
71 if ( $numReady === false ) {
72 wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
73 socket_strerror( socket_last_error() ) . "\n" );
74 break;
75 }
76
77 // Check for timeout, use 1% tolerance since we aimed at having socket_select()
78 // exit at precisely the overall timeout
79 if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
80 wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
81 break;
82 } elseif ( !$numReady ) {
83 continue;
84 }
85
86 foreach ( $readSockets as $key => $socket ) {
87 list( $clientIndex, ) = explode( '/', $key );
88 $client = $this->clients[$clientIndex];
89 $client->doReads();
90 }
91 foreach ( $writeSockets as $key => $socket ) {
92 list( $clientIndex, ) = explode( '/', $key );
93 $client = $this->clients[$clientIndex];
94 $client->doWrites();
95 }
96
97 $done = true;
98 foreach ( $this->clients as $client ) {
99 if ( !$client->isIdle() ) {
100 $done = false;
101 }
102 }
103 }
104
105 foreach ( $this->clients as $client ) {
106 $client->close();
107 }
108 }
109}
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
SquidPurgeClient[] $clients
An HTTP 1.0 client built for the purposes of purging Squid and Varnish.