cron — передача большого файла через SFTP в стек переполнения

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

Разрешенный объем памяти 134217728 байт исчерпан (попытался выделить
4133 байт) в /app/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php

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

Код прост в одну строку, где $ localFile — это уже существующий файл CSV

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

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

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

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

[Изменить после исправления] Проблема исчезла после перехода на версию 2.0.2 с версии 1.0
Я должен был изменить код для поставить

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

7

Решение

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

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

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

2

Другие решения

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

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

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

$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);
0
По вопросам рекламы [email protected]