Subversion Repositories SmartDukaan

Rev

Rev 10739 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10582 lgm 1
<?php defined('BASEPATH') OR exit('No direct script access allowed');
2
 
3
/**
4
**/
5
 
6
/**
7
 * CodeIgniter MCurl Class
8
 *
9
 * Work with remote servers via multi-cURL much easier than using the native PHP bindings.
10
 *
11
 * @package			CodeIgniter
12
 * @subpackage		Libraries
13
 * @category		Libraries
14
 * @author			Chad Hutchins
15
 * @link			http://github.com/chadhutchins/codeigniter-mcurl
16
 */
17
 
18
class Mcurl {
19
 
20
	private $_ci;				// CodeIgniter instance
21
	private $calls = array();	// multidimensional array that holds individual calls and data
22
	private $curl_parent;		// the curl multi handle resource
23
 
24
	function __construct()
25
	{
26
		$this->_ci = & get_instance();
27
		log_message('debug', 'Mcurl Class Initialized');
28
 
29
		if (!$this->is_enabled())
30
		{
31
			log_message('error', 'Mcurl Class - PHP was not built with cURL enabled. Rebuild PHP with --with-curl to use cURL.');
32
		}
33
		else 
34
		{
35
			$this->curl_parent = curl_multi_init();
36
		}
37
	}
38
 
39
	// check to see if necessary function exists
40
	function is_enabled()
41
	{
42
		return function_exists('curl_multi_init');
43
	}
44
 
45
	// method to add curl requests to the multi request queue
46
	function add_call($key=null, $method, $url, $params = array(), $options = array())
47
	{
48
		if (is_null($key))
49
		{
50
			$key = count($this->calls);
51
		}
52
 
53
		// check to see if the multi handle has been closed
54
		// init the multi handle again
55
		$resource_type = get_resource_type($this->curl_parent);
56
		if(!$resource_type || $resource_type == 'Unknown')
57
		{
58
			$this->calls = array();
59
			$this->curl_parent = curl_multi_init();
60
		}
61
 
62
		$this->calls [$key]= array(
63
			"method" => $method,
64
			"url" => $url,
65
			"params" => $params,
66
			"options" => $options,
67
			"curl" => null,
68
			"response" => null,
69
			"error" => null
70
		);
71
 
72
		$this->calls[$key]["curl"] = curl_init();
73
 
74
		$newdata =$params;
75
		// If its an array (instead of a query string) then format it correctly
76
		if (is_array($params))
77
		{
78
			$params = http_build_query($params, NULL, '&');
79
		}
80
 
81
		$method = strtoupper($method);
82
 
83
		// only supports get/post requests
84
		// set some special curl opts for each type of request
85
		switch ($method)
86
		{			
87
			case "POST":
88
				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url);
89
				curl_setopt($this->calls[$key]["curl"], CURLOPT_POST, TRUE);
90
				curl_setopt($this->calls[$key]["curl"], CURLOPT_POSTFIELDS, $params);
91
				curl_setopt($this->calls[$key]["curl"], CURLOPT_SSL_VERIFYPEER, false);
92
				break;
93
 
94
			case "GET":
95
				if (strpos($url,'?') !== false) {
96
    				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url."&".$params);
97
    			}
98
    			else{
99
    				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url."?".$params);
100
    			}
101
				curl_setopt($this->calls[$key]["curl"], CURLOPT_SSL_VERIFYPEER, false);
102
				break;
103
 
104
			default:
105
				log_message('error', 'Mcurl Class - Provided http method is not supported. Only POST and GET are currently supported.');
106
				break;
107
		}
108
 
109
		curl_setopt($this->calls[$key]["curl"], CURLOPT_RETURNTRANSFER, TRUE);
110
		curl_setopt($this->calls[$key]["curl"], CURLOPT_FOLLOWLOCATION, TRUE);
111
 
112
		curl_setopt_array($this->calls[$key]["curl"], $options);
113
 
114
		curl_multi_add_handle($this->curl_parent,$this->calls[$key]["curl"]);		 
115
	}
116
 
117
	// run the calls in the curl requests in $this->calls
118
	function execute()
119
	{
120
		if (count($this->calls))
121
		{
122
			// kick off the requests
123
			do
124
			{
125
				$multi_exec_handle = curl_multi_exec($this->curl_parent,$active);
126
			} while ($active>0);
127
 
128
			// after all requests finish, set errors and repsonses in $this->calls
129
			foreach ($this->calls as $key => $call)
130
			{
131
				$error = curl_error($this->calls[$key]["curl"]);
132
				if (!empty($error))
133
				{
134
					$this->calls[$key]["error"] = $error;
135
				}
136
				$this->calls[$key]["response"] = curl_multi_getcontent($this->calls[$key]["curl"]);
137
				curl_multi_remove_handle($this->curl_parent,$this->calls[$key]["curl"]);
138
			}
139
 
140
			curl_multi_close($this->curl_parent);
141
		}
142
 
143
		return $this->calls;
144
	}
145
 
146
	function debug()
147
	{
148
		echo "<h2>mcurl debug</h2>";
149
		foreach ($this->calls as $call)
150
		{
151
			echo '<p>url: <b>'.$call["url"].'</b></p>';
152
			if (!is_null($call["error"]))
153
			{
154
				echo '<p style="color:red;">error: <b>'.$call["error"].'</b></p>';
155
			}
156
			echo '<textarea cols="100" rows="10">'.htmlentities($call["response"])."</textarea><hr>";
157
		}
158
	}
159
 
160
}
161
 
162
/* End of file mcurl.php */
163
/* Location: ./application/libraries/mcurl.php */