Intereting Posts
Не показывать это, если URL-адрес содержит следующее Объединить значения флажка с помощью php mysql МЕНЬШЕ CSS & Symfony – Динамическое изменение цветовых схем эта динамика (столбец & таблица) PHP выбирает запрос безопасным? Передача данных из динамически созданного списка с одной страницы на другую Как получить URL-адрес открытых в данный момент вкладок во всех браузерах с помощью php или javascript? Передача переменных GET с использованием заголовка в PHP PHP postback url google wallet IAP неопределенная переменная, но переменная определена / объявлена Разбор JSON в JSONArray CakePHP 3 Сохранение BelongsToMany Association Неизвестный тип "" Ошибка Расширение статических классов PHP Разделите все, начиная от строки, кроме числа и знаменателя валюты Как разрешить доступ только к моей базе данных MySQL из приложения iOS? (Использование webapp в качестве шлюза для db) MySQL: избегать выбора столбцов с тем же идентификатором пользователя

Как я могу предотвратить зависание curl_multi_select от osx?

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

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

Обе строки linux и osx работают под управлением PHP 5.3.8. Кажется, что-то связано с тем, что OSX обрабатывает сокеты и сам вызов select (), который отличается от Linux.

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

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

И вот, как выглядит вызов select, используя 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 

Обратите внимание, что вызов select принимает 1001045 микросекунд, что составляет 1 секунду.

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

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

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

Можешь попробовать

 usleep(30000); // 0.03s 

вместо

 curl_multi_select($mh); 

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

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