-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSR.php
139 lines (126 loc) · 4.13 KB
/
SR.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?PHP
/**
* AsyncHttp - êëàññ äëÿ ðàáîòû ñ http ÷åðåç íåáëîêèðóåìûå ñîêåòû
*
* @author Jeck (http://jeck.ru)
*/
class AsyncHttp {
private $sockets = array();
private $threads = array();
/**
* Ñîçäàåò ñîêåò è îòïðàâëÿåò http çàïðîñ
* @param string $url àäðåñ íà êîòîðûé îòïðàâëÿåòñÿ çàïðîñ
* @param string $method òèï çàïðîñà, POST èëè GET
* @param array $data äàííûå îòïðàâëÿåìûå ïðè POST çàïðîñîì
* @return int $id èäåíòèôèêàòîð çàïðîñà
* @return false â ñëó÷àå îøèáêè
*/
private function request($url, $method='GET', $data=array()) {
$parts = parse_url($url);
if (!isset($parts['host'])) {
return false;
}
if (!isset($parts['port'])) {
$parts['port'] = 80;
}
if (!isset($parts['path'])) {
$parts['path'] = '/';
}
if ($data && $method == 'POST') {
$data = http_build_query($data);
} else {
$data = false;
}
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_connect($socket, $parts['host'], $parts['port']);
// Åñëè óñòàíîâèòü ôëàã äî socket_connect ñîåäèíåíèÿ íå ïðîèñõîäèò
socket_set_nonblock($socket);
socket_write($socket, $method." ".$parts['path']." HTTP/1.1\r\n");
socket_write($socket, "Host: ".$parts['host']."\r\n");
socket_write($socket, "Connection: close\r\n");
if ($data) {
socket_write($socket, "Content-Type: application/x-www-form-urlencoded\r\n");
socket_write($socket, "Content-length: ".strlen($data)."\r\n");
socket_write($socket, "\r\n");
socket_write($socket, $data."\r\n");
}
socket_write($socket, "\r\n");
$this->sockets[] = $socket;
return max(array_keys($this->sockets));
}
/**
* Âûïîëíÿåò GET çàïðîñ ñ ïîìîùüþ ìåòîäà AsyncHttp::request
* @see function request
* @param string $url
* @return int $id
*/
public function get($url) {
return $this->request($url, 'GET');
}
/**
* Âûïîëíÿåò POST çàïðîñ ñ ïîìîùüþ ìåòîäà AsyncHttp::request
* @see function request
* @param string $url
* @param array $data
* @return int $id
*/
public function post($url, $data=array()) {
return $this->request($url, 'POST', $data);
}
/**
* Ïîëó÷àåò äàííûå èç ñîêåòîâ è âîçâðàùàåò ìàññèâ èäåíòèôèêàòîðîâ
* óñïåøíî âûïîëíåííûõ çàïðîñîâ â ñëó÷àå óñïåõà
* @return bool|array
*/
public function iteration() {
if (count($this->sockets) == 0) {
return false;
}
$threads = array();
foreach ($this->sockets as $key => $socket) {
$data = socket_read($socket, 0xffff);
if ($data) {
$threads[] = $key;
$this->setThread($key, $data);
unset($this->sockets[$key]);
continue;
}
}
// Íà âñÿêèé ñëó÷àé
usleep(5);
return $threads;
}
/**
* Óñòàíàâëèâàåò îòâåò ñîêåòà
* @return void
*/
private function setThread($id, $data) {
$this->threads[$id] = $data;
}
/**
* Âîçâðàùàåò ïîëó÷åííûå äàííûå èç ñîêåòà
* @param int $id èäåíòèôèêàòîð ñîêåòà
* @param bool $headers=false åñëè true âîçâðàùàåò äàííûå âìåñòå ñ çàãîëîâêàìè
* @return bool|array
*/
public function getThread($id, $headers=false) {
if (!isset($this->threads[$id])) {
return false;
}
if ($headers) {
return $this->threads[$id];
} else {
return substr($this->threads[$id], strpos($this->threads[$id], "\r\n\r\n") + 4);
}
}
}
$async = new AsyncHttp;
$async->get('http://example.com');
$async->get('http://example.net');
$async->get('http://example.org');
while (($threads = $async->iteration()) !== false) {
foreach ($threads as $id) {
echo $async->getThread($id);
}
}
?>