Laravel-excel: [BUG] Временные файлы создаются на одном сервере при экспорте в очередь.

Созданный на 12 авг. 2020  ·  25Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Предпосылки

Версии

  • Версия PHP: 7.2
  • Версия Laravel: 7.22.4
  • Версия пакета: 3.1.20

Описание

Временные файлы создаются на одном сервере при экспорте в очередь

Дополнительная информация

Здравствуйте, я запускаю свое приложение на Laravel Steam (без сервера). При экспорте в очередь временные файлы не сохраняются на диске s3. Я застрял на этом!

Самый полезный комментарий

Вот пример того, как кто-то использует экспорт в очередь с Vapor: # 2434

@patrickbrouwers Большое спасибо за предложение! Теперь он работает как шарм!

Я только что изменился

'local_path' => sys_get_temp_dir (),
в excel.php
с удаленным дисковым паром будет работать так

Благодарим за терпение и предложения.

Все 25 Комментарий

Можете ли вы показать, что вы пытаетесь, не могу помочь с этой небольшой информацией.

@patrickbrouwers
'временные_файлы' => [

    /*
    |--------------------------------------------------------------------------
    | Local Temporary Path
    |--------------------------------------------------------------------------
    |
    | When exporting and importing files, we use a temporary file, before
    | storing reading or downloading. Here you can customize that path.
    |
    */
    'local_path' => storage_path('app/public'),

    /*
    |--------------------------------------------------------------------------
    | Remote Temporary Disk
    |--------------------------------------------------------------------------
    |
    | When dealing with a multi server setup with queues in which you
    | cannot rely on having a shared local temporary path, you might
    | want to store the temporary file on a shared disk. During the
    | queue executing, we'll retrieve the temporary file from that
    | location instead. When left to null, it will always use
    | the local path. This setting only has effect when using
    | in conjunction with queued imports and exports.
    |
    */
    'remote_disk' => 's3',
    'remote_prefix' => null,

],

это мой файл конфигурации, здесь я указываю удаленный диск для временных файлов, но временные файлы не сохраняются на этом диске

Конфиг выглядит неплохо. Я недостаточно знаю о Vapor, чтобы дать вам указатели для отладки, но, возможно, ваш файл конфигурации кэширован или что-то в этом роде. Может быть, люди из Laracasts / Stackoverflow быстрее помогут.

@patrickbrouwers на моем локальном компьютере также возникает эта проблема - временные файлы не сохраняются на этом диске (s3)

Попробуйте выполнить код с помощью xdebug / dd (), возможно, в вашей конфигурации что-то не так, чего я не вижу

@patrickbrouwers Я обнаружил один случай, временные файлы записываются на диск, но происходит чтение фрагмента, он не берет временный файл из s3, есть надежда?

@patrickbrouwers, это аналогичная проблема, например # 2655

Тогда попробуйте установить для этого параметра force значение true?

@patrickbrouwers Я не могу этого сделать. потому что моя проблема в том, что, к сожалению, пар не поддерживает хранение каких-либо временных файлов на ходу.
Так что, возможно, мне нужна поддержка чего-то, что называется serverless - это временные файлы, читаемые и записываемые с s3 / любого диска при чтении фрагментов.

Я считаю, что некоторые люди без проблем используют его на Vapor.

Это ошибка, которую я получаю при попытке экспорта в очередь

ErrorException: fopen (/tmp/storage/framework/laravel-excel/laravel-excel-0KCoC8o8oDS1zsMpu927nkeCTzRgCu1E.xlsx): не удалось открыть поток: нет такого файла или каталога в / var / task / vendor / phpoffice / phpsrpreadsheet / Phpsrpreadsheet / Phpsrpreadsheet Писатель / BaseWriter. php: 111
Трассировки стека:

0 [внутренняя функция]: Illuminate \ Foundation \ Bootstrap \ HandleExceptions-> handleError (2, 'fopen (/ tmp / stor ...', '/ var / task / vendo ...', 111, массив)

1 /var/task/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php(111): fopen ('/ tmp / storage / fr ...', 'wb +')

2 /var/task/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php(186): PhpOffice \ PhpSpreadsheet \ Writer \ BaseWriter-> openFileHandle ('/ tmp / storage / fr ...')

3 /var/task/vendor/maatwebsite/excel/src/Writer.php(140): PhpOffice \ PhpSpreadsheet \ Writer \ Xlsx-> save ('/ tmp / storage / fr ...')

4 /var/task/vendor/maatwebsite/excel/src/Jobs/QueueExport.php(73): Maatwebsite \ Excel \ Writer-> write (Object (App \ Exports \ TaskExportTemplate), Object (Maatwebsite \ Excel \ Files \ RemoteTemporaryFile ), 'XLSX')

5 [внутренняя функция]: Maatwebsite \ Excel \ Jobs \ QueueExport-> дескриптор (Object (Maatwebsite \ Excel \ Writer))

6 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): call_user_func_array (массив, массив)

7 /var/task/vendor/laravel/framework/src/Illuminate/Container/Util.php(37): Illuminate \ Container \ BoundMethod :: Illuminate \ Container {closure} ()

8 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(95): Illuminate \ Container \ Util :: unwrapIfClosure (Объект (Закрытие))

9 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(39): Illuminate \ Container \ BoundMethod :: callBoundMethod (Object (Illuminate \ Foundation \ Application), Array, Object (Closure))

10 /var/task/vendor/laravel/framework/src/Illuminate/Container/Container.php(596): Illuminate \ Container \ BoundMethod :: call (Object (Illuminate \ Foundation \ Application), Array, Array, NULL)

11 /var/task/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(94): Illuminate \ Container \ Container-> call (массив)

12 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate \ Bus \ Dispatcher-> Illuminate \ Bus {closure} (Объект (Maatwebsite \ Excel \ Jobs \ QueueExport))

13 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate \ Pipeline \ Pipeline-> Illuminate \ Pipeline {closure} (Объект (Maatwebsite \ Excel \ Jobs \ QueueExport))

14 /var/task/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate \ Pipeline \ Pipeline-> затем (Объект (Закрытие))

15 /var/task/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(83): Illuminate \ Bus \ Dispatcher-> dispatchNow (Object (Maatwebsite \ Excel \ Jobs \ QueueExport), false)

16 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate \ Queue \ CallQueuedHandler-> Illuminate \ Queue {closure} (Объект (Maatwebsite \ Excel \ Jobs \ QueueExport))

17 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate \ Pipeline \ Pipeline-> Illuminate \ Pipeline {closure} (Объект (Maatwebsite \ Excel \ Jobs \ QueueExport))

18 /var/task/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(85): Illuminate \ Pipeline \ Pipeline-> затем (Объект (Закрытие))

19 /var/task/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(59): Illuminate \ Queue \ CallQueuedHandler-> dispatchThroughMiddleware (Объект (Laravel \ Vapor \ Queue \ VaporJob), Объект (Maatwebsite \ Работа \ QueueExport))

20 /var/task/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(98): Illuminate \ Queue \ CallQueuedHandler-> call (Object (Laravel \ Vapor \ Queue \ VaporJob), Array)

21 /var/task/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(356): Illuminate \ Queue \ Jobs \ Job-> fire ()

22 /var/task/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(306): Illuminate \ Queue \ Worker-> process ('sqs', Object (Laravel \ Vapor \ Queue \ VaporJob), Object (Освещение \ Очередь \ WorkerOptions))

23 /var/task/vendor/laravel/vapor-core/src/Queue/VaporWorker.php(31): Illuminate \ Queue \ Worker-> runJob (Object (Laravel \ Vapor \ Queue \ VaporJob), 'sqs', Object (Освещение \ Очередь \ WorkerOptions))

24 /var/task/vendor/laravel/vapor-core/src/Console/Commands/VaporWorkCommand.php(91): Laravel \ Vapor \ Queue \ VaporWorker-> runVaporJob (Object (Laravel \ Vapor \ Queue \ VaporJob), ' sqs ', Объект (Освещение \ Очередь \ WorkerOptions))

25 [внутренняя функция]: Laravel \ Vapor \ Console \ Commands \ VaporWorkCommand-> handle ()

26 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): call_user_func_array (массив, массив)

27 /var/task/vendor/laravel/framework/src/Illuminate/Container/Util.php(37): Illuminate \ Container \ BoundMethod :: Illuminate \ Container {closure} ()

28 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(95): Illuminate \ Container \ Util :: unwrapIfClosure (Объект (Закрытие))

29 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(39): Illuminate \ Container \ BoundMethod :: callBoundMethod (Object (Illuminate \ Foundation \ Application), Array, Object (Closure))

30 /var/task/vendor/laravel/framework/src/Illuminate/Container/Container.php(596): Illuminate \ Container \ BoundMethod :: call (Object (Illuminate \ Foundation \ Application), Array, Array, NULL)

31 /var/task/vendor/laravel/framework/src/Illuminate/Console/Command.php(134): Illuminate \ Container \ Container-> call (массив)

32 /var/task/vendor/symfony/console/Command/Command.php(258): Illuminate \ Console \ Command-> выполнить (Object (Symfony \ Component \ Console \ Input \ StringInput), Object (Illuminate \ Console \ OutputStyle ))

33 /var/task/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony \ Component \ Console \ Command \ Command-> запустить (Объект (Symfony \ Component \ Console \ Input \ StringInput) , Объект (Освещение \ Консоль \ OutputStyle))

34 /var/task/vendor/symfony/console/Application.php(911): Illuminate \ Console \ Command-> run (Object (Symfony \ Component \ Console \ Input \ StringInput), Object (Symfony \ Component \ Console \ Output) \ BufferedOutput))

35 /var/task/vendor/symfony/console/Application.php(264): Symfony \ Component \ Console \ Application-> doRunCommand (Object (Laravel \ Vapor \ Console \ Commands \ VaporWorkCommand), Object (Symfony \ Component \ Console \ Вход \ StringInput), Объект (Symfony \ Component \ Console \ Output \ BufferedOutput))

36 /var/task/vendor/symfony/console/Application.php(140): Symfony \ Component \ Console \ Application-> doRun (Object (Symfony \ Component \ Console \ Input \ StringInput), Object (Symfony \ Component \ Console \ Выход \ BufferedOutput))

37 /var/task/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony \ Component \ Console \ Application-> run (Object (Symfony \ Component \ Console \ Input \ StringInput), Object (Symfony \ Component \ Console \ Output \ BufferedOutput))

38 /var/task/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate \ Console \ Application-> run (Object (Symfony \ Component \ Console \ Input \ StringInput), Object (Symfony \ Component \ Console \ Output \ BufferedOutput))

39 /var/task/vendor/laravel/vapor-core/src/Runtime/Handlers/QueueHandler.php(60): Illuminate \ Foundation \ Console \ Kernel-> handle (Объект (Symfony \ Component \ Console \ Input \ StringInput) , Объект (Symfony \ Component \ Console \ Output \ BufferedOutput))

40 /var/task/cliRuntime.php(66): Laravel \ Vapor \ Runtime \ Handlers \ QueueHandler-> handle (массив)

41 /var/task/vendor/laravel/vapor-core/src/Runtime/LambdaRuntime.php(53): {closure} ('afe5516a-587e-5 ...', массив)

42 /var/task/cliRuntime.php(68): Laravel \ Vapor \ Runtime \ LambdaRuntime-> nextInvocation (Объект (Закрытие))

43 /var/task/runtime.php(30): require ('/ var / task / cliRu ...')

44 /opt/bootstrap.php(6): require ('/ var / task / runti ...')

45 {main}

Кажется, что с вашей конфигурацией все еще что-то не так. Он не использует правильный локальный путь, он использует временную папку системы вместо папки хранилища Laravel.

@patrickbrouwers Larevel Steam использует s3 в качестве хранилища по умолчанию, но laravel excel по-прежнему читает из локальной системы / сервера,

@patrickbrouwers Есть ли техническое ограничение, не позволяющее читать файл напрямую из s3?

Да, он всегда будет читать с локального сервера после копирования с s3. PhpSpreadsheet может читать только с локального диска

При правильной конфигурации все должно работать нормально

@patrickbrouwers В парах нет серверов ... Aws lambda обрабатывает весь код. Итак, возможно, для поддержки Excel в очереди нам нужно запустить сервер и, возможно, нужно запустить как микроэкземпляр, например вещь!

Я знаю, что такое Vapor и serverless. Я бы посоветовал вам попробовать Laracasts или Stackoverflow, я не думаю, что мы чего-то добьемся, если вы не попробуете мои предложения.

Я знаю, что такое Vapor и serverless. Я бы посоветовал вам попробовать Laracasts или Stackoverflow, я не думаю, что мы чего-то добьемся, если вы не попробуете мои предложения.

Я попробовал ваши предложения и перепроверил конфигурации согласно документации.
На первом этапе создаются временные файлы,
Но когда мы переходим к случаю чтения электронной таблицы, возникает эта ошибка.

Кроме того, другая зависимость «Laravel snappy» нуждается в такой поддержке локального диска.

Но в моем случае этот локальный диск работать не будет!

Итак, когда я связался с паром по поводу этого дела, они предложили сохранить файл на s3 и использовать его повторно. Что я должен делать ?

Надеюсь, вы понимаете мою ситуацию!

Другие люди могли использовать локальный файл, который синхронизируется с s3. Больше я ничем не могу помочь, извини. Как я предлагал несколько раз, попробуйте форум, связанный с Laravel.

Вот пример того, как кто-то использует экспорт в очередь с Vapor: https://github.com/Maatwebsite/Laravel-Excel/pull/2434

Я попробую вышеуказанное решение

Вот пример того, как кто-то использует экспорт в очередь с Vapor: # 2434

@patrickbrouwers Большое спасибо за предложение! Теперь он работает как шарм!

Я только что изменился

'local_path' => sys_get_temp_dir (),
в excel.php
с удаленным дисковым паром будет работать так

Благодарим за терпение и предложения.

@patrickbrouwers , будут ли эти временные файлы, созданные laravel-excel, автоматически удаляться через определенное время? Что, если я установлю это значение как null в excel.php?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги