Musisz plik tymczasowy, w którym można umieścić bity od pliku źródłowego oraz co do być dołączone:
$sp = fopen('source', 'r');
$op = fopen('tempfile', 'w');
while (!feof($sp)) {
$buffer = fread($sp, 512); // use a buffer of 512 bytes
fwrite($op, $buffer);
}
// append new data
fwrite($op, $new_data);
// close handles
fclose($op);
fclose($sp);
// make temporary file the new source
rename('tempfile', 'source');
ten sposób, cała zawartość source
nie są wczytywane do pamięci. Podczas korzystania z cURL, można pominąć ustawianie CURLOPT_RETURNTRANSFER
i zamiast tego dodać bufor wyjściowy, który zapisuje do pliku tymczasowego:
function write_temp($buffer) {
global $handle;
fwrite($handle, $buffer);
return ''; // return EMPTY string, so nothing's internally buffered
}
$handle = fopen('tempfile', 'w');
ob_start('write_temp');
$curl_handle = curl_init('http://example.com/');
curl_setopt($curl_handle, CURLOPT_BUFFERSIZE, 512);
curl_exec($curl_handle);
ob_end_clean();
fclose($handle);
Wydaje się, że ja zawsze tęsknię oczywiste. Jak zauważył Marc, istnieje CURLOPT_FILE
, aby bezpośrednio zapisać odpowiedź na dysk.
Jakie jest źródło tych danych? Poza tym większość konfiguracji PHP powinna obsługiwać 2MB bez problemu. Twój limit pamięci może być poniżej. – webbiedave
Skąd pochodzi plik? Jeśli już istnieje na dysku, najodpowiedniejsze byłoby "copy()". – mario
W tym przypadku otrzymuję plik ze zdalnego serwera za pomocą zwijania. Tak, mam to w zmiennej. –