Как заставить запрос php curl ждать ответа вечно (после успешной отправки запроса) - PullRequest
2 голосов
/ 23 сентября 2011

Я пытаюсь отправить большие zip-файлы в приложение Tomcat, используя curl в php-скрипте. Поскольку это большой zip-файл, на tomcat-сервере потребуется некоторое время, чтобы распаковать zip-файл (около 2-5 минут), но запрос curl никогда не ждет более 30 секунд, прежде чем он просто продолжится, как если бы он получил пустой ответ.

Код, с которым я могу воспроизвести проблему:

set_time_limit(0);

$uploadURL = 'http://192.168.0.2:8080/some/url/'
$userid = 'a-user';
$password = 'a-password';
$zipfile = '/tmp/myfile.zip';

$ch = curl_init($uploadURL);
curl_setopt($ch, CURLOPT_HEADER, array(
    'Connection: Keep-Alive',
    'Keep-Alive: 3600'
    ));
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_USERPWD, $userid.":".$password);
curl_setopt($ch, CURLOPT_POST, true);
$post = array(
  "uploadMode" => "uploadOnly",
  "id" => $id,
  "numberOfFiles" => "1",
  "file"=>"@".$zipfile.";type=application/zip"
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 45);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_TIMEOUT, 200);
$response = curl_exec($ch);

Единственное подозрение, которое я оставил, заключается в том, что curl выполняет запрос, а затем время ожидания истекает из-за определенного количества секунд, без каких-либо байтов, отправляемых назад или вперед (так называемый Между_байтами_выходом). Но я не могу найти вариант скручивания, чтобы помочь с этим, поэтому я надеюсь, что это что-то еще.

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

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

Скорее всего, cURL просто автоматически отменяет запрос из-за слишком низкой скорости передачи, когда ваш Tomcat распаковывает zip.

Это происходит, если средняя скорость передачи падает ниже CURLOPT_LOW_SPEED_LIMIT байтов/ секунда для CURLOPT_LOW_SPEED_TIME секунд.

Попробуйте добавить соответствующие параметры с высоким и / или нижним пределом, например:

curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1);   // cancel if below 1 byte/second
curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 30);   // for a period of 30 seconds

Для быстрого выбора я бы рекомендовал использовать ВРЕМЯнемного выше, чем ваш Tomcat действительно должен распаковать данный тестовый почтовый индекс.

0 голосов
/ 13 марта 2012

Для настройки заголовков запроса используйте CURLOPT_HTTPHEADER, а не CURLOPT_HEADER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...