Странная задержка POSTing от php fsockopen - PullRequest
0 голосов
/ 21 января 2010

Я работаю со следующим разделом php-кода. Цель состоит в том, чтобы POST файл изображения с одного сервера на другой. Это работает отлично и очень быстро, пока файл <~ 250k. Более 250 тыс., И время обработки увеличивается до ~ 60 секунд и увеличивается с размером изображения. </p>

Есть идеи?

Спасибо!

John

$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 ]

4 голосов
/ 21 января 2010

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

1 голос
/ 14 марта 2012

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

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

Тогда на сервере доступны $_POST['fileName'] и $_POST['fileData'].

0 голосов
/ 22 января 2010

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

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

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

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

Спасибо.

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

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

...