Скручивание PHP на Apache открывает только одно соединение на сервер на браузер - PullRequest
0 голосов
/ 21 января 2011

У меня проблема с curl в PHP, которую я не могу понять. У меня есть веб-сервер (Apache), который общается с веб-службой через HTTPS на другом сервере Apache. Мы назовем их «сервер A» и «сервер B».

Проблема, с которой я сталкиваюсь, состоит в том, что сервер A устанавливает только одно соединение за раз, используя curl с сервером B на браузер, подключенный к серверу A. Я не уверен, является ли это проблемой curl или apache. В нескольких местах я видел ссылки на максимальное соединение для каждого сервера, равное одному для клиента curl, но я не могу проверить, существует ли он.

Сценарий:

  • Я загружаю двадцать разных страниц в трех разных браузерах, каждая в своей вкладке / окне в этом браузере. Я попробовал Firefox, Chrome и Konqueror одновременно. В Firefox были значительно увеличены все ограничения на количество подключений к серверу: config
  • Все эти страницы размещены на сервере A, и загрузка была начата почти одновременно
  • Каждый экземпляр страницы на сервере A общается с сервером B, используя curl
  • Один вызов этого типа на сервер B обычно занимает ~ 10 секунд
  • Только одно TCP-соединение от A-> B открыто одновременно для каждого браузера, подключенного к серверу A (всего 3 от A-> B)
  • Я проверил, что несколько соединений из браузеров открыты к серверу A

AFAICT все запросы сериализуются. Я могу убедиться, что из браузера в сервер A открыто несколько подключений, но из A-> B в браузере, подключенном к A., открыто только одно https-соединение для браузера *.

Сервер B может обрабатывать много соединений одновременно, но по какой-то причине сервер A не будет открывать несколько соединений с сервером B. Я попытался отправить «Соединение: закрыть» с обоих серверов A и B, чтобы посмотреть, поможет ли это. Это не так.

Я обнаружил, что многие люди говорят о создании нескольких асинхронных подключений для одного сценария, но я хочу открыть несколько подключений в разных экземплярах страницы к одному внешнему серверу.

Есть идеи, что это за проблема или как ее исправить?

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Собственные сеансы php (обработчик файлов) используют эксклюзивную модель блокировки - только один процесс / поток может одновременно работать с данными для определенного идентификатора сеанса. Когда вызывается session_start (), выполнение будет блокироваться до тех пор, пока процесс не получит блокировку файла сеанса. Блокировка снимается, когда вызывается session_write_close (), который автоматически вызывает php после завершения скрипта. Вы можете вызвать его вручную, чтобы снять блокировку и зафиксировать ваши изменения. При желании вы можете использовать session_start () и session_write_close () несколько раз за выполнение скрипта.

0 голосов
/ 21 января 2011

Считаете ли вы, что сервер B допускает только 1 безопасное соединение?

Как я знаю, это проблемы безопасности браузера, которые допускают только 1 безопасное соединение с одним хостом за один раз.

...