Laravel-excel: [BUG] Des fichiers temporaires sont créés sur un serveur lors de l'exportation en file d'attente

Créé le 12 août 2020  ·  25Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Conditions préalables

Versions

  • Version PHP : 7.2
  • Version Laravel : 7.22.4
  • Version du package : 3.1.20

La description

Les fichiers temporaires sont créés sur un serveur lors de l'exportation en file d'attente

Information additionnelle

Bonjour, je lance mon application sur laravel vapor (serverless). Lors de l'exportation en file d'attente, les fichiers temporaires ne sont pas stockés sur le disque s3. Je suis bloqué là-dessus !

bug

Commentaire le plus utile

Voici un exemple de quelqu'un qui utilise des exportations en file d'attente avec Vapor : #2434

@patrickbrouwers Merci

je viens de changer

'local_path' => sys_get_temp_dir(),
dans excel.php
avec le disque distant, la vapeur fonctionnera comme ceci

Merci pour votre patience et vos suggestions.

Tous les 25 commentaires

Pouvez-vous montrer ce que vous essayez, ne peut pas aider avec cette petite information.

@patrickbrouwers
'fichiers_temporaires' => [

    /*
    |--------------------------------------------------------------------------
    | 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,

],

c'est mon fichier de configuration, ici je spécifie un disque distant pour les fichiers temporaires, mais les fichiers temporaires ne sont pas stockés sur ce disque

La configuration semble bonne. Je ne connais pas assez Vapor pour vous donner des pointeurs pour déboguer, mais peut-être que votre fichier de configuration est mis en cache ou quelque chose du genre. Peut-être que les gens sur Laracasts/Stackoverflow seront plus rapides pour vous aider.

@patrickbrouwers sur ma machine locale, ce problème arrive également - les fichiers temporaires ne sont pas stockés sur ce disque (s3)

Essayez de parcourir le code avec xdebug/dd() il y a probablement quelque chose qui ne va pas dans votre configuration que je ne peux pas voir

@patrickbrouwers J'ai trouvé un cas, les fichiers temporaires sont écrits sur le disque, mais la lecture de morceaux se produit, il ne prend pas le fichier temporaire de s3, un espoir ?

@patrickbrouwers c'est un problème similaire à celui de #2655

Essayez de définir ce paramètre de force sur true alors ?

@patrickbrouwers Je ne peux pas le faire. car mon problème est que, malheureusement, Vapor ne prend pas en charge le stockage de fichiers temporaires en cours de route.
Donc, peut-être que j'ai besoin d'un support pour quelque chose appelé sans serveur - c'est-à-dire des fichiers temporaires lus et écrits à partir de s3/n'importe quel disque lors de la lecture de morceaux

Je crois qu'il y a des gens qui l'utilisent sur Vapor sans problème

C'est l'erreur que je reçois sur la vapeur en essayant l'exportation en file d'attente

ErrorException : fopen(/tmp/storage/framework/laravel-excel/laravel-excel-0KCoC8o8oDS1zsMpu927nkeCTzRgCu1E.xlsx) : échec de l'ouverture du flux : aucun fichier ou répertoire de ce type dans /var/task/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ Writer/BaseWriter. php:111
Trace de la pile:

0 [fonction interne] : Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'fopen(/tmp/stor...', '/var/task/vendo...', 111, Array)

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 [fonction interne] : Maatwebsite\Excel\Jobs\QueueExport->handle(Object(Maatwebsite\Excel\Writer))

6 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37) : call_user_func_array(Array, 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(Object(Closure))

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(Array)

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

13 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Maatwebsite\Excel\Jobs\QueueExport))

14 /var/task/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(98): Illuminate\Pipeline\Pipeline->then (Object (Closure))

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}(Object(Maatwebsite\Excel\Jobs\QueueExport))

17 /var/task/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Maatwebsite\Excel\Jobs\QueueExport))

18 /var/task/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(85): Illuminate\Pipeline\Pipeline->then (Object (Closure))

19 /var/task/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(59): Illuminate\Queue\CallQueuedHandler->dispatchThroughMiddleware(Object(Laravel\Vapor\Queue\VaporJob), Objet(Maatwebsite\Excel \Jobs\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 (Illuminer\Queue\WorkerOptions))

23 /var/task/vendor/laravel/vapor-core/src/Queue/VaporWorker.php(31): Illuminate\Queue\Worker->runJob(Object(Laravel\Vapor\Queue\VaporJob), 'sqs', Object (Illuminer\Queue\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', Objet (Illuminate\Queue\WorkerOptions))

25 [fonction interne] : Laravel\Vapor\Console\Commands\VaporWorkCommand->handle()

26 /var/task/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37) : call_user_func_array(Array, 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(Object(Closure))

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(Array)

32 /var/task/vendor/symfony/console/Command/Command.php(258) : Illuminate\Console\Command->execute(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->run(Object(Symfony\Component\Console\Input\StringInput) , Objet (Illuminer\Console\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 \Input\StringInput), Objet(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 \Sortie\BufferedOutput))

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

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

40 /var/task/cliRuntime.php(66): Laravel\Vapor\Runtime\Handlers\QueueHandler->handle (Array)

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

42 /var/task/cliRuntime.php(68): Laravel\Vapor\Runtime\LambdaRuntime->nextInvocation(Object(Closure))

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

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

45 {principal}

Il semble toujours que quelque chose ne va pas avec votre configuration. Il n'utilise pas le bon chemin local, il utilise le dossier temporaire du système au lieu du dossier de stockage de Laravel.

@patrickbrouwers Larevel vapor utilise s3 comme stockage par défaut, mais laravel excel continue de lire à partir du système/serveur local,

@patrickbrouwers Y a-t-il une limitation technique empêchant de pouvoir lire le fichier directement depuis s3 ?

Oui, il sera toujours lu depuis le local après la copie depuis s3. PhpSpreadsheet ne peut lire qu'à partir du disque local

Avec une configuration correcte, cela devrait fonctionner très bien

@patrickbrouwers Dans la vapeur, il n'y a pas de serveurs... Aws lambda traite tout le code. Donc, peut-être que pour la prise en charge d'Excel en file d'attente, nous devons lancer un serveur et peut-être avoir besoin de l'exécuter en tant que micro-instance !

Je sais ce qu'est Vapor et serverless. Je vous suggère d'essayer Laracasts ou Stackoverflow, je ne pense pas que nous arrivions à quelque chose si vous n'essayez pas mes suggestions.

Je sais ce qu'est Vapor et serverless. Je vous suggère d'essayer Laracasts ou Stackoverflow, je ne pense pas que nous arrivions à quelque chose si vous n'essayez pas mes suggestions.

J'ai essayé vos suggestions et vérifié les configurations conformément à la documentation.
Les fichiers temporaires sont créés sur la première étape,
Mais quand nous arrivons au cas de lecture de feuille de calcul, cette erreur se produit.

De plus, une autre dépendance "Laravel snappy" a besoin de ce type de support de disque local.

Mais, ce boîtier de disque local ne fonctionnera pas dans mon cas !

Ainsi, lorsque j'ai contacté Vapor à propos de cette affaire, ils ont suggéré de stocker le fichier sur s3 et de le réutiliser. Que dois-je faire ?

J'espère que vous comprenez ma situation !

D'autres personnes ont pu utiliser un fichier local qui se synchronise avec s3. Je ne peux pas aider plus que ça, je suis désolé. Comme je l'ai suggéré à plusieurs reprises, essayez un forum lié à Laravel.

Voici un exemple de personne utilisant des exportations en file d'attente avec Vapor : https://github.com/Maatwebsite/Laravel-Excel/pull/2434

je vais essayer la solution ci-dessus

Voici un exemple de quelqu'un qui utilise des exportations en file d'attente avec Vapor : #2434

@patrickbrouwers Merci

je viens de changer

'local_path' => sys_get_temp_dir(),
dans excel.php
avec le disque distant, la vapeur fonctionnera comme ceci

Merci pour votre patience et vos suggestions.

@patrickbrouwers , ces fichiers temporaires créés par laravel-excel seront-ils automatiquement supprimés après un certain temps ? Que se passe-t-il si je définis cette valeur comme null dans excel.php ?

Cette page vous a été utile?
0 / 5 - 0 notes