Như câu trả lời khác nói:
- bạn không thể có tất cả những gì trong bộ nhớ
- một giải pháp sẽ được sử dụng
CURLOPT_FILE
Tuy nhiên, bạn có thể không muốn thực sự tạo ra một tập tin ; bạn có thể muốn làm việc với dữ liệu trong bộ nhớ ... Sử dụng nó ngay sau khi nó "đến".
Một giải pháp khả thi có thể được definind bạn sở hữu dòng wrapper, và sử dụng thế này, thay vì một tập tin thực tế, với CURLOPT_FILE
Trước hết, xem:
Và bây giờ, chúng ta hãy đi với một ví dụ.
Trước tiên, hãy tạo lớp dòng wrapper của chúng tôi:
class MyStream {
protected $buffer;
function stream_open($path, $mode, $options, &$opened_path) {
// Has to be declared, it seems...
return true;
}
public function stream_write($data) {
// Extract the lines ; on y tests, data was 8192 bytes long ; never more
$lines = explode("\n", $data);
// The buffer contains the end of the last line from previous time
// => Is goes at the beginning of the first line we are getting this time
$lines[0] = $this->buffer . $lines[0];
// And the last line os only partial
// => save it for next time, and remove it from the list this time
$nb_lines = count($lines);
$this->buffer = $lines[$nb_lines-1];
unset($lines[$nb_lines-1]);
// Here, do your work with the lines you have in the buffer
var_dump($lines);
echo '<hr />';
return strlen($data);
}
}
Những gì tôi làm là:
- làm việc trên các khối dữ liệu (tôi sử dụng var_dump, nhưng bạn muốn làm công cụ thông thường của bạn thay vào đó) khi họ đến
- Lưu ý rằng bạn không nhận được "dòng đầy đủ": kết thúc của một dòng là phần bắt đầu của một đoạn và đầu của cùng một dòng đó là ở cuối đoạn trước đó; như vậy, bạn cần phải giữ một số bộ phận của một chunck giữa các cuộc gọi đến
stream_write
Tiếp theo, chúng tôi đăng ký dòng wrapper này, để được sử dụng với giả giao thức "thử nghiệm":
// Register the wrapper
stream_wrapper_register("test", "MyStream")
or die("Failed to register protocol");
Và, bây giờ, chúng tôi yêu cầu curl của chúng tôi, như chúng ta sẽ làm gì khi writting vào một tập tin "thật", như câu trả lời khác đề nghị:
// Open the "file"
$fp = fopen("test://MyTestVariableInMemory", "r+");
// Configuration of curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.rue89.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILE, $fp); // Data will be sent to our stream ;-)
curl_exec($ch);
curl_close($ch);
// Don't forget to close the "file"/stream
fclose($fp);
Lưu ý rằng chúng ta không làm việc với một tệp thực, nhưng với giao thức giả của chúng ta.
Bằng cách này, mỗi lần một đoạn dữ liệu đến, phương pháp MyStream::stream_write
sẽ được gọi, và sẽ có thể làm việc trên một lượng nhỏ dữ liệu (khi tôi kiểm tra, tôi luôn luôn có 8192 byte, bất cứ điều gì giá trị tôi sử dụng cho CURLOPT_BUFFERSIZE
)
Một vài lưu ý:
- Bạn cần phải kiểm tra điều này hơn tôi đã làm, rõ ràng
- việc triển khai stream_write của tôi có thể sẽ không hoạt động nếu các dòng dài hơn 8192 byte; tùy thuộc vào bạn để vá nó ;-)
- Nó chỉ có nghĩa là một vài gợi ý, và không phải là một giải pháp làm việc đầy đủ: bạn phải kiểm tra (một lần nữa), và có lẽ mã nhiều hơn một chút!
Tuy nhiên, tôi hy vọng điều này sẽ giúp ;-)
Hãy vui vẻ!
Câu trả lời trong http://stackoverflow.com/a/1342760/4668 là câu trả lời hay nhất của tôi. –