See Release Notes
Long Term Support Release
1 <?php 2 3 /** 4 * Licensed to Jasig under one or more contributor license 5 * agreements. See the NOTICE file distributed with this work for 6 * additional information regarding copyright ownership. 7 * 8 * Jasig licenses this file to you under the Apache License, 9 * Version 2.0 (the "License"); you may not use this file except in 10 * compliance with the License. You may obtain a copy of the License at: 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 * 20 * PHP Version 7 21 * 22 * @file CAS/Request/AbstractRequest.php 23 * @category Authentication 24 * @package PhpCAS 25 * @author Adam Franco <afranco@middlebury.edu> 26 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 27 * @link https://wiki.jasig.org/display/CASC/phpCAS 28 */ 29 30 /** 31 * This interface defines a class library for performing multiple web requests 32 * in batches. Implementations of this interface may perform requests serially 33 * or in parallel. 34 * 35 * @class CAS_Request_CurlMultiRequest 36 * @category Authentication 37 * @package PhpCAS 38 * @author Adam Franco <afranco@middlebury.edu> 39 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 40 * @link https://wiki.jasig.org/display/CASC/phpCAS 41 */ 42 class CAS_Request_CurlMultiRequest 43 implements CAS_Request_MultiRequestInterface 44 { 45 private $_requests = array(); 46 private $_sent = false; 47 48 /********************************************************* 49 * Add Requests 50 *********************************************************/ 51 52 /** 53 * Add a new Request to this batch. 54 * Note, implementations will likely restrict requests to their own concrete 55 * class hierarchy. 56 * 57 * @param CAS_Request_RequestInterface $request reqest to add 58 * 59 * @return void 60 * @throws CAS_OutOfSequenceException If called after the Request has been sent. 61 * @throws CAS_InvalidArgumentException If passed a Request of the wrong 62 * implmentation. 63 */ 64 public function addRequest (CAS_Request_RequestInterface $request) 65 { 66 if ($this->_sent) { 67 throw new CAS_OutOfSequenceException( 68 'Request has already been sent cannot '.__METHOD__ 69 ); 70 } 71 if (!$request instanceof CAS_Request_CurlRequest) { 72 throw new CAS_InvalidArgumentException( 73 'As a CAS_Request_CurlMultiRequest, I can only work with CAS_Request_CurlRequest objects.' 74 ); 75 } 76 77 $this->_requests[] = $request; 78 } 79 80 /** 81 * Retrieve the number of requests added to this batch. 82 * 83 * @return int number of request elements 84 * @throws CAS_OutOfSequenceException if the request has already been sent 85 */ 86 public function getNumRequests() 87 { 88 if ($this->_sent) { 89 throw new CAS_OutOfSequenceException( 90 'Request has already been sent cannot '.__METHOD__ 91 ); 92 } 93 return count($this->_requests); 94 } 95 96 /********************************************************* 97 * 2. Send the Request 98 *********************************************************/ 99 100 /** 101 * Perform the request. After sending, all requests will have their 102 * responses poulated. 103 * 104 * @return bool TRUE on success, FALSE on failure. 105 * @throws CAS_OutOfSequenceException If called multiple times. 106 */ 107 public function send () 108 { 109 if ($this->_sent) { 110 throw new CAS_OutOfSequenceException( 111 'Request has already been sent cannot send again.' 112 ); 113 } 114 if (!count($this->_requests)) { 115 throw new CAS_OutOfSequenceException( 116 'At least one request must be added via addRequest() before the multi-request can be sent.' 117 ); 118 } 119 120 $this->_sent = true; 121 122 // Initialize our handles and configure all requests. 123 $handles = array(); 124 $multiHandle = curl_multi_init(); 125 foreach ($this->_requests as $i => $request) { 126 $handle = $request->initAndConfigure(); 127 curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 128 $handles[$i] = $handle; 129 curl_multi_add_handle($multiHandle, $handle); 130 } 131 132 // Execute the requests in parallel. 133 do { 134 curl_multi_exec($multiHandle, $running); 135 } while ($running > 0); 136 137 // Populate all of the responses or errors back into the request objects. 138 foreach ($this->_requests as $i => $request) { 139 $buf = curl_multi_getcontent($handles[$i]); 140 $request->_storeResponseBody($buf); 141 curl_multi_remove_handle($multiHandle, $handles[$i]); 142 curl_close($handles[$i]); 143 } 144 145 curl_multi_close($multiHandle); 146 } 147 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body