2012-05-25 2 views
3

Мое приложение использует curl_multi_select, чтобы ждать завершения звонков. Тайм-аут по умолчанию в curl_multi_select устанавливается в 1 секунду. Для данного URL-адреса этот вызов немедленно возвращается в Linux, но ждет полного 1-секундного тайм-аута в OSX.Как предотвратить зависание curl_multi_select от osx?

К сожалению, изменение тайм-аута в коде на самом деле не является вариантом в моей ситуации - мне нужен способ изменения конфигурации компьютера или использования разных php-модулей/exes.

В обоих операционных системах Linux и OSX работает PHP 5.3.8. Кажется, что-то связано с тем, что OSX обрабатывает сокеты и сам вызов select(), который отличается от Linux.

Вот что делает завиток вызов:

'url' => string 'HTTP://172.19.105.171:8070 <SNIPPED> '... (length=1439) 
... 
'namelookup_time' => float 1.001309 

А вот что выбрать вызов выглядит как с помощью dtruss:

sudo dtruss -a -n httpd > dtruss.txt.2 2>&1 
    PID/THRD RELATIVE ELAPSD CPU SYSCALL(args)  = return 
... 
21524/0x17136:  14369  37  31 connect_nocancel(0xA, 0x7FFF649DB9F8, 0x6A) = 0 0 
21524/0x17136:  14383  15  10 sendto_nocancel(0xA, 0x7FAA786E4AD0, 0x1C)  = 28 0 
20285/0x8d8d: 755608 1001045  16 select(0x0, 0x0, 0x0, 0x0, 0x7FFF64353A70) = 0 0 

Обратите внимание, что выбор вызова берет 1001045 microsecs, что 1 второй ,

Итак - это связано с тем, как OSX обрабатывает розетки? Это что-то, что я мог бы изменить с помощью другой опции сборки в PHP/Curl? Или есть что-то, что я могу изменить в своей сетевой конфигурации, чтобы сделать вызов select() быстрее?

Это оригинальный вопрос, который я имел, прежде чем я сузили его к текущему вопросу:
PHP/curl: namelookup_time/dns slowing requests

Другие исследования:
http://www.somacon.com/p537.php
http://svn.php.net/viewvc/php/php-src/trunk/ext/curl/multi.c?view=markup (curl_multi_select исходный код)

ответ

1

Вы можете попробовать

usleep(30000); // 0.03s 

вместо

curl_multi_select($mh); 

Вы, вероятно, нужно играть с количеством микросекунд, но я думаю, что 0.03s достаточно для базового использования.

Также вам придется самостоятельно выполнять тайм-ауты. Это можно сделать с помощью записи microtime(true) переменной и сравнения ее с текущим временем при каждом вызове цикла.

+0

Спасибо за предложение, но, к сожалению, я не могу изменить код. – vaughnkoch

Смежные вопросы