MediaWiki  master
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 }
SquidPurgeClient [] $clients
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not...