Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Session handling not working in worker mode #85

Closed
htuscher opened this issue Nov 7, 2022 · 10 comments
Closed

Session handling not working in worker mode #85

htuscher opened this issue Nov 7, 2022 · 10 comments
Labels
question Further information is requested

Comments

@htuscher
Copy link

htuscher commented Nov 7, 2022

I'm trying to use a bigger Symfony application in worker mode. If the caches are warm, it generally works as long as no session is used.
If I visit actions containing e.g. flash message

<div class="flashbags container">
    {% for type, messages in app.flashes %}
        ...
    {% endfor %}
</div>

I get this:

<b>Fatal error</b>:  Uncaught RuntimeException: Failed to start the session. in /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:186
Stack trace:
#0 /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php(352): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage-&gt;start()
#1 /app/vendor/symfony/http-foundation/Session/Session.php(261): Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage-&gt;getBag('flashes')
#2 /app/vendor/symfony/http-foundation/Session/Session.php(273): Symfony\Component\HttpFoundation\Session\Session-&gt;getBag('flashes')
#3 /app/vendor/symfony/twig-bridge/AppVariable.php(177): Symfony\Component\HttpFoundation\Session\Session-&gt;getFlashBag()
@withinboredom
Copy link
Collaborator

Which session driver are you using?

@htuscher
Copy link
Author

htuscher commented Nov 8, 2022

    session:
        name: session-
        handler_id: null
        cookie_secure: auto
        cookie_samesite: lax
        storage_factory_id: session.storage.factory.native
        enabled: true
        storage_id: session.storage.native
        cookie_httponly: true
        gc_probability: 1
        save_path: /app/var/cache/prod_hd0b46c9c54c1cfce0c444726ba0c1595/sessions
        metadata_update_threshold: 0

@withinboredom
Copy link
Collaborator

withinboredom commented Nov 8, 2022

The following appears to work fine:

session_id(session_create_id());
var_dump(session_start());

Which seems to be about what symfony is doing.

I imagine it is related to the save handler. Does your server's user have write access to /app/var/cache/prod_hd0b46c9c54c1cfce0c444726ba0c1595/sessions? If you can write up a minimal reproduction sample that'd be fantastic.

@dunglas
Copy link
Owner

dunglas commented Nov 15, 2022

What version of Symfony are you using? It looks like session.storage_id doesn't exist. I tried to reproduce the issue, without success so far.

@htuscher
Copy link
Author

I'm trying to use the latest version of Shopware https://www.shopware.com/en/download which is based on Symfony 5.4.
It does work without the worker mode as a possible hint.
I could also provide an instance with SSH access for you if you'd like.

@dunglas
Copy link
Owner

dunglas commented Nov 16, 2022

Do you know if Shopware is already compatible with RoadRunner and similar tools? I wonder if we aren't in the same situation as with Drupal, where a custom session handler that hasn't been designed to be reset is used.

@htuscher
Copy link
Author

htuscher commented Nov 16, 2022

They are currently moving towards Symfony Flex and Runtime compatibility. I've tested the version which should already be Runtime compatible https://github.com/shopware/recipes/blob/main/shopware/core/6.4/public/index.php respectevly https://github.com/shopware/production/tree/flex
They use the regular Symfony sessions.
https://github.com/shopware/platform/blob/trunk/src/Core/Framework/Routing/SalesChannelRequestContextResolver.php#L94

@shyim
Copy link
Contributor

shyim commented Nov 16, 2022

Shopware is not running on any of the tools. We started working in that direction by removing state in classes and adding runtime support. For now I would not recommending running such a tool before the entire ecosystem has pushed to this. It could be that extensions holds state which break or show information from previous customer.

Feel free to make pull requests to Shopware to improve the support. As I know also twig globals are only applied once and some variables relating to routing are wrong.

It's not so easy as just switching the runtime 😀

@dunglas
Copy link
Owner

dunglas commented Nov 16, 2022

Thanks for the info @shyim! Let's close this one for now.

@dunglas dunglas closed this as completed Nov 16, 2022
@tdumalin
Copy link

Can you explain how did you manage to fix this issue ?
I'm using frankenphp with the symfony-docker template and got the exact same issue.
In dev session works fine but in production mode session works at container launch, but after navigating on few pages everything breaks and session starts throwing an error.

I've tried to used different handler (null, redis, mysql) and had the same results for all 3.

php-1          | {"message":"Warning: session_start(): User session functions are not defined","context":{"exception":{"class":"ErrorException","message":"Warning: session_start(): User session functions are not defined","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:185"}},"level":300,"level_name":"WARNING","channel":"php","datetime":"2023-11-29T09:24:58.197360+01:00","extra":{}}
php-1          | {"message":"Warning: session_start(): Failed to initialize storage module: user (path: )","context":{"exception":{"class":"ErrorException","message":"Warning: session_start(): Failed to initialize storage module: user (path: )","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:185"}},"level":300,"level_name":"WARNING","channel":"php","datetime":"2023-11-29T09:24:58.197418+01:00","extra":{}}
php-1          | {"message":"Uncaught PHP Exception RuntimeException: \"Failed to start the session.\" at /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php line 186","context":{"exception":{"class":"RuntimeException","message":"Failed to start the session.","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:186"}},"level":500,"level_name":"CRITICAL","channel":"request","datetime":"2023-11-29T09:24:58.197581+01:00","extra":{}}
php-1          | {"message":"Warning: session_start(): User session functions are not defined","context":{"exception":{"class":"ErrorException","message":"Warning: session_start(): User session functions are not defined","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:185"}},"level":300,"level_name":"WARNING","channel":"php","datetime":"2023-11-29T09:24:58.199112+01:00","extra":{}}
php-1          | {"message":"Warning: session_start(): Failed to initialize storage module: user (path: )","context":{"exception":{"class":"ErrorException","message":"Warning: session_start(): Failed to initialize storage module: user (path: )","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:185"}},"level":300,"level_name":"WARNING","channel":"php","datetime":"2023-11-29T09:24:58.199248+01:00","extra":{}}
php-1          | {"message":"Exception thrown when handling an exception (RuntimeException: Failed to start the session. at /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php line 186)","context":{"exception":{"class":"RuntimeException","message":"Failed to start the session.","code":0,"file":"/app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:186"}},"level":500,"level_name":"CRITICAL","channel":"request","datetime":"2023-11-29T09:24:58.199566+01:00","extra":{}}
php-1          | {"level":"error","ts":1701246298.1998334,"msg":"PHP Fatal error:  Uncaught RuntimeException: Failed to start the session. in /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php:186
Stack trace:
#0 /app/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php(352): Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage->start()
#1 /app/vendor/symfony/http-foundation/Session/Session.php(261): Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage->getBag()
#2 /app/vendor/symfony/http-foundation/Session/Session.php(283): Symfony\\Component\\HttpFoundation\\Session\\Session->getBag()
#3 /app/vendor/symfony/http-foundation/Session/Session.php(77): Symfony\\Component\\HttpFoundation\\Session\\Session->getAttributeBag()\n#4 /app/vendor/sonata-project/page-bundle/src/CmsManager/CmsManagerSelector.php(81): Symfony\\Component\\HttpFoundation\\Session\\Session->get()
#5 /app/vendor/sonata-project/page-bundle/src/CmsManager/CmsManagerSelector.php(67): Sonata\\PageBundle\\CmsManager\\CmsManagerSelector->isEditor()
#6 /app/vendor/sonata-project/page-bundle/src/Route/CmsPageRouter.php(141): Sonata\\PageBundle\\CmsManager\\CmsManagerSelector->retrieve()
#7 /app/vendor/symfony-cmf/routing/src/ChainRouter.php(192): Sonata\\PageBundle\\Route\\CmsPageRouter->match()
#8 /app/vendor/symfony-cmf/routing/src/ChainRouter.php(158): Symfony\\Cmf\\Component\\Routing\\ChainRouter->doMatch()
#9 /app/vendor/symfony/http-kernel/EventListener/RouterListener.php(111): Symfony\\Cmf\\Component\\Routing\\ChainRouter->matchRequest()
#10 /app/vendor/symfony/event-dispatcher/EventDispatcher.php(230): Symfony\\Component\\HttpKernel\\EventListener\\RouterListener->onKernelRequest()
#11 /app/vendor/symfony/event-dispatcher/EventDispatcher.php(59): Symfony\\Component\\EventDispatcher\\EventDispatcher->callListeners()
#12 /app/vendor/symfony/http-kernel/HttpKernel.php(139): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch()
#13 /app/vendor/symfony/http-kernel/HttpKernel.php(75): Symfony\\Component\\HttpKernel\\HttpKernel->handleRaw()
#14 /app/vendor/symfony/http-kernel/Kernel.php(202): Symfony\\Component\\HttpKernel\\HttpKernel->handle()
#15 /app/vendor/runtime/frankenphp-symfony/src/Runner.php(35): Symfony\\Component\\HttpKernel\\Kernel->handle()
#16 [internal function]: Runtime\\FrankenPhpSymfony\\Runner->Runtime\\FrankenPhpSymfony\\{closure}()
#17 /app/vendor/runtime/frankenphp-symfony/src/Runner.php(30): frankenphp_handle_request()
#18 /app/vendor/autoload_runtime.php(35): Runtime\\FrankenPhpSymfony\\Runner->run()
#19 /app/public/index.php(5): require_once('...')

I can't debug because when i tried to edit the files on the container, it doesn't change anything, If i well understood the behavior of frankenphp, the app is running on the memory, Is there any way to edit the project and "update" the memory with the new edited files ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

5 participants