у меня есть PHP сценарий, который использует cURL
чтобы загрузить файл с другого сервера.
Размер файла около 24 МБ. Я понимаю, почему сам скрипт, загружающий файл, требует немного времени для выполнения, однако любой запрос к сайту во время выполнения скрипта будет выполняться до тех пор, пока скрипт не завершится.
Этого не произошло на нашем старом общем сервере с тем же сценарием. Новый сервер является облачным. Я увеличил количество узлов до 10 (выделенный ЦП 6 ГГц, оперативная память 3760 МБ, пропускная способность 2500 ГБ), и это не повлияло на эту проблему.
Я не возражаю против того, чтобы сам скрипт выполнялся долго, поскольку это будет автоматизированная задача для потока данных. Однако я не могу заблокировать весь сайт, пока он работает.
Есть идеи, почему это могло происходить?
Обновить похоже, что это происходит только локально. Если я попытаюсь загрузить сайт на отдельный компьютер во время выполнения сценария, он будет работать должным образом.
Теперь ключевой вопрос: что еще делает ваш сценарий, кроме извлечения этого файла? Обрабатывает его и вставляет данные в базу данных? Возможно, в вашей старой среде у вас был MySQL с таблицами InnoDB, а в новой среде MySQL с таблицами MyISAM.
MyISAM требует полной блокировки таблицы во время операций записи вместо блокировок на уровне строк, которые есть в InnoDB, поэтому это может привести к зависанию вашего сайта, если ваш фактический сайт использует те же таблицы, что и сценарий curl.
Возможно, вы сможете «ignore_user_abort (true)», а затем использовать перенаправление HTTP на странице на другую страницу.
PHP 5 также имеет неплохую многопоточность, которая тоже может помочь.