Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Освобождение ресурсов
Благодаря системе подсчета ссылок, введенной в PHP 4 Zend Engine, определение отсутствия ссылок на ресурс происходит автоматически, после чего он освобождается сборщиком мусора. Поэтому, очень редко требуется освобождать память вручную.
не видел рекомендаций не закрывать ресурсы (дескрипторы), я ему процитировал кусок из мануала, где говорится, что обычно их закрывать не требуетсяЭм, так файловый дескриптор в PHP — это же число, нет? Т. е. поскольку дескрипторы не являются объектами, у среды выполнения нет возможности отследить, остались ли ещё ссылки на данный ресурс.
for () {
$fp = fopen('data.txt', 'w');
fwrite($fp, 'test...');
fclose($fp);
}
_request создает некий https.request. Может я чего-то не понимаю, но я запускаю вот такой код:http.request({host: 'evernote.com', path: '/favicon.ico'},
function(res){
console.log('STATUS: ' + res.statusCode);
}).end();
https.request({host: 'evernote.com', path: '/favicon.ico'},
function(res){
console.log('STATUS: ' + res.statusCode);
https.request({host: 'evernote.com', path: '/favicon.ico'},
function(res){
console.log('STATUS: ' + res.statusCode);
}).end();
}).end();for (var i = 0; i < 10; i ++) {
https.request({host: 'evernote.com', path: '/favicon.ico'},
function(res){
console.log('STATUS: ' + res.statusCode);
res.end();
}).end();
}
By default, the HTTP Agent will only open 5 simultaneous connections to a single host. You can change this easily: (assuming you've required the HTTP module as http)
http.globalAgent.maxSockets = 20; // or whatever
var agent = new http.Agent;
agent.maxSockets = 1;
function work() {
http.request({host: 'evernote.com', path: '/favicon.ico', agent: agent},
function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {});
res.on('end', function () { work(); });
}).end();
}
work();
agent: agent, и под каждый запрос начнет открываться отдельное соединение. Как вам такое замечательное открытие?SPDY (читается как «speedy», «спиди») — протокол прикладного уровня для передачи веб-контента.Википедия
Additional Information
The SPDY protocol uses HTTPS, so your site needs to serve content over HTTPS in order to benefit from mod_spdy. If your site does not currently serve content over HTTPS, ask your hosting provider how to enable HTTPS for your site.
в PHP скрипт заново полностью инициализируется при каждом запросе (по сути новый запрос — новый процесс) и пул держать затруднительноУчитывая, что PHP заточен на освобождение ресурсов после завершения скрипта, да ещё и однопоточен, не понимаю, что мешает держать по пулу на скрипт.
Also, don't overuse a connection. Amazon S3 will accept up to 100 requests before it closes a connection (resulting in 'connection reset'). Rather than having this happen, use a connection for 80-90 requests before closing and re-opening a new connection.
for () {
$fp = fopen('data.txt', 'w');
fwrite($fp, 'test...');
fclose($fp);
}
Да, речь пойдет о keep alive. Суть в том, что, начиная с http 1.1, клиент и сервер могут договориться не закрывать установленное tcp-соединение после завершения запроса, а переиспользовать его для следующих запросов.На самом деле это возможно и в HTTP/1.0
% netcat nginx.com 80
GET / HTTP/1.0
Host: nginx.com
Connection: keep-alive
HTTP/1.1 200 OK
Server: nginx/1.5.1
Date: Sun, 23 Jun 2013 14:51:25 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 10655
Last-Modified: Wed, 29 May 2013 10:09:50 GMT
Connection: keep-alive
Keep-Alive: timeout=15
ETag: "51a5d3ee-299f"
Accept-Ranges: bytes
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>NGINX Enterprise Software | Nginx, Inc.</title>
[...]
</body>
</html>
GET /products.html HTTP/1.0
Host: nginx.com
Connection: keep-alive
HTTP/1.1 200 OK
Server: nginx/1.5.1
Date: Sun, 23 Jun 2013 14:52:02 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 17154
Last-Modified: Wed, 29 May 2013 10:06:26 GMT
Connection: keep-alive
Keep-Alive: timeout=15
ETag: "51a5d322-4302"
Accept-Ranges: bytes
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>NGINX SE | Nginx, Inc.</title>
[...]
</body>
</html>
^C%
The Keep-Alive extension to HTTP/1.0 and the persistent connection feature of HTTP/1.1 [...] For HTTP/1.0 clients, Keep-Alive connections will only be used if they are specifically requested by a client.И nginx это также явно поддерживает, соответсвующая обработка присутствует. Если не послать
Connection: keep-alive то для HTTP/1.0 клиента соединение будет закрыто. В то же время, отсутствие заголовка Connection: keep-alive не приводит к закрытию соединения в случае HTTP/1.1, оно там по умолчанию persistent, если не сказано обратного Connection: close.На самом деле это возможно и в HTTP/1.0
The Keep-Alive extension to HTTP/1.0 [...]
Утверждать, что такая возможность появилась только с приходом HTTP/1.1 — просто неверно.
Все что вам нужно сделать в случае использования curl — перенести вызов curl_init() из метода, который делает запрос, в конструктор класса
function curl_post_lookslikeasync($url, $params)
{
foreach ($params as $key => &$val) {
if (is_array($val)) $val = implode(',', $val);
$post_params[] = $key.'='.urlencode($val);
}
$post_string = implode('&', $post_params);
$parts=parse_url($url);
$fp = fsockopen($parts['host'],
isset($parts['port'])?$parts['port']:80,
$errno, $errstr, 30);
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: ".strlen($post_string)."\r\n";
$out.= "Connection: Close\r\n\r\n";
if (isset($post_string)) $out.= $post_string;
fwrite($fp, $out);
fclose($fp);
}
Все cookies, скрытые поля, WebForms, URL rewrite (это каким боком тут?) передаются внутри каждого http-сообщения, они не являются состоянием подключения. Необходимость передавать какие-то данные не делает эти данные состоянием.
There can be complex interactions between stateful and stateless protocols among different protocol layers. For example, HTTP is an example of a stateless protocol layered on top of TCP, a stateful protocol, which is layered on top of IP, another stateless protocol, which is routed on a network that employs BGP, another stateful protocol, to direct the IP packets riding on the network.
Http запросы — мы все это делаем неправильно