2016-07-05 17 views
7

Tôi có tệp lớn (200 MB trở lên). Tôi cần phải chuyển nó qua công việc cron PHP. Sử dụng Phpseclib cung cấp cho các lỗi sau:Chuyển tệp lớn qua SFTP bằng PHP

Allowed memory size of 134217728 bytes exhausted (tried to allocate 4133 bytes) in /app/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php

Có cách nào tôi có thể làm điều này với PHP cron job?

Mã này là đơn giản một dòng trong đó $ localFile là một tập tin CSV đã tồn tại

$sftp->put('/Import/coupons/coupons_import_test.csv', $localFile, NET_SFTP_LOCAL_FILE); 

PS. Điều này cần được thực hiện sau khi PHP tạo tệp đó trong thư mục /tmp để thời gian của tập lệnh chuyển phải được phát.

[Chỉnh sửa] Tôi không có ý định tăng giới hạn bộ nhớ vì các tệp sau có thể có kích thước cao hơn. Một giải pháp mà tôi có thể chuyển tệp ở các phần (chế độ nối thêm) hoặc sử dụng một số tập lệnh shell với PHP cron có thể đáng giá

Kích thước tệp trên máy chủ từ xa là 111,4 MB trong khi tệp thực tế lớn hơn nhiều ở cục bộ.

[Chỉnh sửa sau khi sửa chữa] Vấn đề này đã biến mất sau khi chuyển sang phiên bản 2.0.2 từ phiên bản 1.0 tôi đã phải sửa đổi mã cho đặt

$sftp->put('/Import/coupons/coupons_import.csv', $localFile, $sftp::SOURCE_LOCAL_FILE); 
+1

có thể trùng lặp của [Được phép kích thước bộ nhớ của 33.554.432 byte kiệt sức (cố gắng phân bổ 43.148.176 byte) trong php] (http://stackoverflow.com/questions/415801/cho phép-bộ nhớ-kích thước-of-33554432-byte-exhausted-cố gắng-để-phân bổ-43148176-byte) –

+0

php.ini của bạn có như là ** memory_limit **? Thông thường một cái gì đó như 64M hoặc 128M, bạn cần phải tăng này. – ggdx

+0

Có cách nào để làm điều này mà không tăng giới hạn? – aeonsleo

Trả lời

2

Phpeclib chỉ nên chuyển các tệp lớn mà không cần tăng bộ nhớ khả dụng.

Tôi nghĩ bạn có thể đã gặp lỗi cũ "SSH2: không tính thời lượng dữ liệu so với kích thước cửa sổ". Bạn rất có thể có thể sử dụng phiên bản cũ của Phpseclib (Phiên bản bị lỗi cũ được đóng gói ngay cả với phần mềm tương đối mới như ví dụ Magento 1.9. *)

Kiểm tra phiên bản của bạn nếu không muốn nói là redownload mới nhất của nó từ https://github.com/phpseclib/phpseclib

+0

Tôi đang sử dụng phpseclib 1.0 bởi nhà soạn nhạc yêu cầu thiết lập heroku. – aeonsleo

+0

Tôi không biết nếu đó là lỗi trong phiên bản 1.0 mà bạn đã chỉ ra điều gì đã gây ra vấn đề, nhưng khi tôi thay đổi sang phiên bản 2.0.2 vấn đề đã biến mất. Tôi mặc dù phải sửa đổi mã một chút. – aeonsleo

+0

@aeonsleo - Bạn đang sử dụng phiên bản 1.0 nào? Có vẻ như 'bản cập nhật nhà soạn nhạc' có thể cũng đã khắc phục sự cố nếu 2.0.2 đã làm .. – neubert

1

Thay nhìn thấy mã mà bạn sử dụng dự đoán của tôi là bạn đang cố gắng tải tệp 200mb dưới dạng chuỗi và bạn đang cố gắng tải lên dưới dạng chuỗi. ví dụ. $sftp->put('filename.remote', file_get_contents('filename.local'));. Nếu vậy, hãy thử thay vào đó:

$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE); 
+0

Tôi đang thực hiện chính xác cách bạn đã đề cập. – aeonsleo

+2

Để nhận xét thêm, tôi cần xem một số mã. Bạn có thể chỉnh sửa nó vào bài viết orig của bạn. Ngoài ra, bao nhiêu tập tin được tải lên khi bạn nhận được lỗi bộ nhớ? – neubert

0

Điều này thực sự đã thay đổi một chút với phiên bản phpseclib> = 2.0.5. Bạn nên bao gồm không gian tên use phpseclib\Net\SFTP;, sau đó làm một cái gì đó như thế này:

$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE); 
Các vấn đề liên quan