Я написал некоторый код, используя потоки, которые отправляют файл через мультиформную запись на другой сайт. Так что это код php сервера для -> другого веб-сервера. В настоящее время я не могу использовать «curl», я ограничен потоками.
Моя проблема (комментарий ниже, проблема здесь) заключается в том, что если я столкнусь с очень большим файлом, он может исчерпать память на веб-сервере php.
Есть ли способ работы с потоками PHP для прямой записи в поток запросов при использовании потока php, который указывает на URL (конечная точка rest api)? сейчас, после того, как все собрано вместе, он выдает
file_get_contents (…)
Итак, вот фрагмент кода, который создает и отправляет файл.
private function getOptionsForMulitPartFile($request, $cred, $file)
{
$mimeType = $this->getMimeType($file);
$contentType = 'Content-Type: multipart/form-data; boundary=' . MULTIPART_BOUNDARY;
$contentLength = "Content-Length: " . filesize($file->getFilePathAndName());
$file_contents = $file->readWholeFile(); //<----Concern here, that file maybe too large.
$data = "--" . MULTIPART_BOUNDARY . "\r\n" .
"Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"" . basename($file->getFilePathAndName()) . "\"\r\n" .
"Content-Type: " . $mimeType . "\r\n\r\n" . $file_contents."\r\n";
$data .= "--". MULTIPART_BOUNDARY . "--\r\n";
// set up the request context
return $this->createOption($request, $cred, $data, $contentType, $contentLength);
}
При чтении больших файлов вы можете использовать ob_flush () + stream_copy_to_stream методы, так что каждый X байт, который вы читаете из файла, вы можете перенести на другой сервер.
Других решений пока нет …