2016-07-05 10 views
7

У меня есть большой файл (200 МБ вверх). Мне нужно перенести его через PHP cron job. Использование Phpseclib дает следующее сообщение об ошибке:Передача большого файла через SFTP в PHP

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

Есть ли способ, что я могу сделать это с PHP cron job?

код просто одна строка, где $ лок_файл является уже существующий файл CSV

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

PS. Это необходимо сделать после того, как PHP создает этот файл в папке /tmp, поэтому необходимо ввести время начала сценария передачи.

[Изменить] Я не намерен увеличивать ограничение памяти, так как позже файлы могут иметь более высокие размеры. Решение, в котором я могу передать файл по частям (режим добавления) или использовать какой-либо скрипт оболочки с PHP cron, может стоить

Размер файла на удаленном сервере составляет 111,4 МБ, а фактический файл намного больше на локальном.

[Edit после исправления] Проблема исчезла после того, как изменения в версии 2.0.2 от версии 1.0 мне пришлось модифицировать код для положить

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

Возможный дубликат [Разрешенные размер памяти 33554432 байт исчерпаны (пытались выделить 43148176 байт) в PHP] (http://stackoverflow.com/questions/415801/allowed-memory-size-of-33554432-bytes-exhausted-tried-to-allocate-43148176-byte) –

+0

Что у вашего php.ini есть ** memory_limit **? Обычно что-то вроде 64M или 128M, вам нужно увеличить это. – ggdx

+0

Есть ли способ сделать это без увеличения лимита? – aeonsleo

ответ

2

Phpseclib должен отлично переносить большие файлы без необходимости увеличения доступной памяти.

Я думаю, вы, вероятно, попали в старую ошибку «SSH2: не учитывайте длину данных по размеру окна». Вы, скорее всего, можете использовать более старую версию Phpseclib (Старшая неисправна версия поставляется даже с относительно нового программного обеспечения, как, например, Magento 1,9. *)

Проверьте вашу версию, если не последняя перезакачка его от https://github.com/phpseclib/phpseclib

+0

Я использую phpseclib 1.0 от композитора, требуемого на геройку. – aeonsleo

+0

Я не знаю, была ли эта ошибка в версии 1.0, на которую вы указали причину проблемы, но когда я перешел на версию 2.0.2, проблема исчезла. Мне нужно немного изменить код. – aeonsleo

+0

@aeonsleo - Какую версию 1.0 вы использовали? Кажется, что 'comper update', возможно, также исправил проблему, если 2.0.2 сделал .. – neubert

1

Вместо того, чтобы видеть код, что вы используя мое предположение, вы пытаетесь загрузить файл 200mb в виде строки, и вы пытаетесь загрузить его в виде строки. например. $sftp->put('filename.remote', file_get_contents('filename.local'));. Если это так, попробуйте это вместо этого:

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

Я делаю именно то, как вы упомянули. – aeonsleo

+2

Чтобы прокомментировать, мне нужно будет увидеть код. Вы можете отредактировать его в свой пост. Кроме того, сколько файлов загружено к моменту получения ошибки памяти? – neubert

0

Это фактически немного изменилось с версией phpseclib> = 2.0.5. Вы должны включать пространство имен use phpseclib\Net\SFTP;, то сделать что-то вроде этого:

$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);