Subversion Repositories SmartDukaan

Rev

Rev 11107 | Rev 11170 | Go to most recent revision | Details | Compare with Previous | 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
		if (!$this->is_enabled())
29
		{
30
			log_message('error', 'Mcurl Class - PHP was not built with cURL enabled. Rebuild PHP with --with-curl to use cURL.');
31
		}
32
		else 
33
		{
34
			$this->curl_parent = curl_multi_init();
35
		}
36
	}
37
 
38
	// check to see if necessary function exists
39
	function is_enabled()
40
	{
41
		return function_exists('curl_multi_init');
42
	}
43
 
44
	// method to add curl requests to the multi request queue
45
	function add_call($key=null, $method, $url, $params = array(), $options = array())
46
	{
47
		if (is_null($key))
48
		{
49
			$key = count($this->calls);
50
		}
51
 
52
		// check to see if the multi handle has been closed
53
		// init the multi handle again
54
		$resource_type = get_resource_type($this->curl_parent);
55
		if(!$resource_type || $resource_type == 'Unknown')
56
		{
57
			$this->calls = array();
58
			$this->curl_parent = curl_multi_init();
59
		}
60
 
61
		$this->calls [$key]= array(
62
			"method" => $method,
63
			"url" => $url,
64
			"params" => $params,
65
			"options" => $options,
66
			"curl" => null,
67
			"response" => null,
68
			"error" => null
69
		);
70
 
71
		$this->calls[$key]["curl"] = curl_init();
72
 
73
		$newdata =$params;
74
		// If its an array (instead of a query string) then format it correctly
75
		if (is_array($params))
76
		{
77
			$params = http_build_query($params, NULL, '&');
78
		}
79
 
80
		$method = strtoupper($method);
81
 
82
		// only supports get/post requests
83
		// set some special curl opts for each type of request
84
		switch ($method)
85
		{			
86
			case "POST":
87
				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url);
88
				curl_setopt($this->calls[$key]["curl"], CURLOPT_POST, TRUE);
89
				curl_setopt($this->calls[$key]["curl"], CURLOPT_POSTFIELDS, $params);
90
				curl_setopt($this->calls[$key]["curl"], CURLOPT_SSL_VERIFYPEER, false);
91
				break;
92
 
93
			case "GET":
94
				if (strpos($url,'?') !== false) {
95
    				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url."&".$params);
96
    			}
97
    			else{
98
    				curl_setopt($this->calls[$key]["curl"], CURLOPT_URL, $url."?".$params);
99
    			}
100
				curl_setopt($this->calls[$key]["curl"], CURLOPT_SSL_VERIFYPEER, false);
101
				break;
102
 
103
			default:
104
				log_message('error', 'Mcurl Class - Provided http method is not supported. Only POST and GET are currently supported.');
105
				break;
106
		}
107
		curl_setopt($this->calls[$key]["curl"], CURLOPT_RETURNTRANSFER, TRUE);
108
		curl_setopt($this->calls[$key]["curl"], CURLOPT_FOLLOWLOCATION, TRUE);
11109 lgm 109
		if(($key == 'tracking') || ($key == 'signup') || ($key == 'orderconfirmation_process')){
110
			$cookiesStringToPass="";
111
			foreach($_COOKIE as $cookie) {
112
				if ($cookiesStringToPass) {
113
	     			$cookiesStringToPass  .= ';';
114
	    		}
115
	    		if(is_object(json_decode($cookie))){
116
	    			$cookieInfo = json_decode($cookie);
117
	    			foreach ($cookieInfo as $info) {
118
	    				$cookiesStringToPass .= $info->name . '=' . addslashes($info->value);
119
	    			}
120
	    		}
121
			}
122
			curl_setopt($this->calls[$key]["curl"], CURLOPT_COOKIE, $cookiesStringToPass);
123
		}
10582 lgm 124
		curl_setopt_array($this->calls[$key]["curl"], $options);
125
		curl_multi_add_handle($this->curl_parent,$this->calls[$key]["curl"]);		 
126
	}
127
 
128
	// run the calls in the curl requests in $this->calls
129
	function execute()
130
	{
131
		if (count($this->calls))
132
		{
133
			// kick off the requests
134
			do
135
			{
136
				$multi_exec_handle = curl_multi_exec($this->curl_parent,$active);
137
			} while ($active>0);
138
 
139
			// after all requests finish, set errors and repsonses in $this->calls
140
			foreach ($this->calls as $key => $call)
141
			{
142
				$error = curl_error($this->calls[$key]["curl"]);
143
				if (!empty($error))
144
				{
10739 lgm 145
					if($key != 'recommended_accessories'){
10582 lgm 146
					$this->calls[$key]["error"] = $error;
10739 lgm 147
					$errmsg ='<h3>OH SNAP!!!! :</h3><p>Something is not right. <br/><h1>But Relax</h1> <br/>We are working hard on it. </p>';
148
					//$this->write_log_send_mail('error',$msg);
149
					//$this->session->set_flashdata('errormsg',$errmsg);
10802 lgm 150
					//redirect(base_url().'error_page/index');
151
					//exit();
10739 lgm 152
					}
10582 lgm 153
				}
154
				$this->calls[$key]["response"] = curl_multi_getcontent($this->calls[$key]["curl"]);
11103 lgm 155
				//print_r($this->calls[$key]['response']);
10800 lgm 156
				$http_status = curl_getinfo($this->calls[$key]["curl"], CURLINFO_HTTP_CODE);
10802 lgm 157
				if($key != 'recommended_accessories'){
158
					if($http_status != 200) {
159
        				redirect(base_url().'error_page/index');
160
        				exit();
161
					}
10800 lgm 162
				}
10756 lgm 163
				curl_multi_remove_handle($this->curl_parent,$this->calls[$key]["curl"]);
164
				// if($key != 'recommended_accessories'){
165
				// if(isset($this->calls[$key]["response"]) && !empty($this->calls[$key]["response"])){
166
				// 	curl_multi_remove_handle($this->curl_parent,$this->calls[$key]["curl"]);	
167
				// }else{
168
				// 	$this->calls[$key]["error"] = $error;
169
				// 	$errmsg ='<h3>OH SNAP!!!! :</h3><p>Something is not right. <br/><h1>But Relax</h1> <br/>We are working hard on it. </p>';
170
				// 	//$this->write_log_send_mail('error',$msg);
171
				// 	//$this->session->set_flashdata('errormsg',$errmsg);
172
				// 	redirect(base_url().'error_page/index',$data);
173
				// 	exit();
174
				// }
175
				// }
10582 lgm 176
			}
177
 
178
			curl_multi_close($this->curl_parent);
179
		}
11103 lgm 180
		//print_r($this->calls);
10582 lgm 181
		return $this->calls;
182
	}
183
 
184
	function debug()
185
	{
186
		echo "<h2>mcurl debug</h2>";
187
		foreach ($this->calls as $call)
188
		{
189
			echo '<p>url: <b>'.$call["url"].'</b></p>';
190
			if (!is_null($call["error"]))
191
			{
192
				echo '<p style="color:red;">error: <b>'.$call["error"].'</b></p>';
193
			}
194
			echo '<textarea cols="100" rows="10">'.htmlentities($call["response"])."</textarea><hr>";
195
		}
196
	}
197
 
198
}
199
 
200
/* End of file mcurl.php */
201
/* Location: ./application/libraries/mcurl.php */