У меня большой файл (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
папка, поэтому время передачи сценария передачи должно вступить в игру.
Размер файла на удаленном сервере составляет 111,4 МБ, а на локальном сервере размер файла значительно больше.
[Изменить после исправления] Проблема исчезла после перехода на версию 2.0.2 с версии 1.0$sftp->put('/Import/coupons/coupons_import.csv', $localFile, $sftp::SOURCE_LOCAL_FILE);
Phpseclib прекрасно справляется с передачей больших файлов без необходимости увеличения доступной памяти.
Я думаю, что вы, вероятно, столкнулись со старой ошибкой «SSH2: не считайте длину данных в зависимости от размера окна». Скорее всего, вы используете более старую версию Phpseclib (более старая неисправная версия поставляется даже с относительно новым программным обеспечением, таким как, например, Magento 1.9. *)
Проверьте свою версию, если не последняя, скачайте ее с https://github.com/phpseclib/phpseclib
Вместо того, чтобы видеть код, который вы используете, я предполагаю, что вы пытаетесь загрузить 200-мегабайтный файл как строку, и вы пытаетесь загрузить его как строку. например. $sftp->put('filename.remote', file_get_contents('filename.local'));
, Если так, то попробуйте это вместо:
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
Это на самом деле немного изменилось с версией phpseclib> = 2.0.5. Вы должны включить пространство имен use phpseclib\Net\SFTP;
затем сделайте что-то вроде этого:
$sftp->put('filename.remote', 'filename.local', SFTP::SOURCE_LOCAL_FILE);