2013-12-04 3 views
1

У меня есть простой HTTP-сервер Node.js (следующий код), где я пытаюсь ответить на любой запрос немедленно, а затем обрабатывать запрос асинхронно.PHP curl timeout from node.js HTTP-сервер

var http = require('http'); 
var url = require('url'); 
var querystring = require('querystring'); 
http.createServer(function parseRequest(request, response){ 
    // Responding without any delay 
    response.end(); 
    var query = url.parse(request.url).query; 
    var param1 = querystring.parse(query)["param1"]; 
    var param2 = querystring.parse(query)["param2"]; 
    console.log("Param1: " + param1 + " and param2: " + param2); 
}).listen(8888); 
console.log("HTTP server started on port 8888"); 

У меня есть еще один PHP-скрипт (следующий код), который отправляет запрос Керла GET на HTTP-сервер. Я с указанием локон тайм-аут соединения в миллисекундах

<?php 
$url = "http://127.0.0.1:8888?param1=value1&param2=value2"; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_HEADER, 0); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 1000); 
$start_time = microtime(); 
$response = curl_exec($curl); 
$stop_time = microtime(); 
if(curl_errno($curl) != 0) 
    echo "Curl error " . curl_error($curl) . "\n"; 
curl_close($curl); 
echo "Started at " . $start_time . " and stopped at " . $stop_time . "\n"; 
?> 

Обратите внимание, что я дал 1000 мс в качестве соединения тайм-аут для завитка, и это работает отлично. Я получаю сообщение, подобное следующему из моего PHP-скрипта.

Начатый в 0.57268300 1386132518 и остановился на 0.58577100 1386132518

Но когда я даю значение меньше 1000 (даже 999), завитка раз соединение, и я получаю следующее сообщение

Curl ошибка таймаута была достигнута

Начатый в 0.55238500 1386131950 и остановился на 0,55245800 1386131950

Есть ли какие-либо настройки, которые мне не хватает здесь? Я использую php 5.4.6 и curl 7.27.0.

ответ

2

Рассматривая документы PHP по этому значению таймаута, вы можете столкнуться с ограничением вашей локальной системы. docs состояние:

Если Libcurl построен, чтобы использовать стандартное имя системы распознаватель, что часть Соединим будет по-прежнему использовать полный второй разрешение для тайм-аута с минимальным тайм-аут позволил одной секунды.

При установке этого значения ниже минимального значения, допустимого для таймаута, вы можете заставить систему автоматически запускать таймаут.

ОБНОВЛЕНИЕ: Похож на это previous question - та же проблема. Для того, чтобы установить суб 1000мс значение для этого вам необходимо:

Вы должны собрать Libcurl для себя, используя --enable нарезки-распознаватель, а затем скомпилировать локон расширения для PHP против

+1

Спасибо. Создание libcurl из источника с помощью --enable-threaded-resolver решило проблему. Мои извинения за отправку дубликата вопроса. – tilmik