Странная задержка POSTing от php fsockopen

Я работаю со следующим разделом кода PHP. Цель состоит в том, чтобы отправить файл изображения с одного сервера на другой. Это работает отлично и очень быстро, пока файл <~ 250k. Гораздо больше 250 тысяч, и время обработки увеличивается до ~ 60 секунд и увеличивается с увеличением размера изображения.

Есть идеи?

Спасибо!

Джон

$fileContents = file_get_contents($_FILES[$key]['tmp_name']);
$time = strtotime("now");
$body = "--f6sd54c2
Content-Disposition: form-data; name=\"id\"
Content-Length: " . strlen($id) . "

{$id}
--f6sd54c2
Content-Disposition: form-data; name=\"key\"
Content-Length: " . strlen("654t2bsr65t42czd13fvs6dry87") . "

654t2bsr65t42czd13fvs6dry87
--f6sd54c2
Content-Disposition: form-data; name=\"time\"
Content-Length: " . strlen($time) . "

{$time}
--f6sd54c2
Content-Disposition: form-data; name=\"photo\"; filename=\"photo.jpg\"
Content-Type: image/jpeg
Content-Length: " . strlen($fileContents) . "

{$fileContents}
--f6sd54c2--";


$headers = "POST /photos/process.php HTTP/1.1
Host: www.hostname.com
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=f6sd54c2
Content-Length: " . strlen($body) . "

";

$fp = fsockopen("www.hostname.com", 80, $errno, $errstr);
if ($fp){
    fwrite($fp, $headers . $body);
    fclose($fp);
}

4 ответа

Вы используете HTTP/1.1, даже если вы закрываете соединение сразу. HTTP/1.1 поддерживает соединение, которое может вводить задержку. Вы должны были использовать CURL, писать свой собственный клиент всегда плохо, особенно для HTTP. Инженеры никогда не должны заново изобретать воли. Если изменение заголовка на HTTP/1.0 не работает, curl решит проблему.

Если этому другому серверу не нужно обрабатывать данные, поступающие из составной html-формы с полем просмотра / ввода файла, то вы можете настроить передачу файла с помощью обычного запроса POST примерно так:

$postQuery = 'fileName=image.jpg&fileData='.base64_encode(file_get_contents('image.jpg'));

Потом на сервере $_POST['fileName'] а также $_POST['fileData'] доступен.

У вас также есть Connection: keep-alive.. это будет держать соединение открытым. Попробуйте установить соединение: закрыть соединение после запроса

Поскольку я изначально писал без регистрации, я не уверен, что могу ответить / отредактировать свое сообщение правильно, но я отвечу здесь...

  • Подключение к серверу происходит просто через сеть.

  • Конечно, было бы намного проще использовать CURL в моей жизни, но, к сожалению, он недоступен на этом сервере.

  • Пробовал переход на HTTP/1.0, пробовал соединение: закрыть, но проблема осталась прежней. Почти мгновенный перевод ниже определенного уровня (несколько сотен килобайт), где-нибудь выше этого уровня, и это занимает не менее одной минуты.

Благодарю.

Другие вопросы по тегам