web-dev-qa-db-ja.com

PHP7 + Symfony 2.8、セッションデータの書き込みに失敗しました

自分でphp7をコンパイルしました(974f6c2a705)。 symfonyを使用してphp7 + php-fpm + nginxを実行すると、次のエラーが発生します。

(セッションにsnc redisバンドルを使用:)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp)

(ネイティブセッションサポートを使用:)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/[...]/app/cache/dev/sessions)

phpにはフォルダーへの読み取り/書き込みアクセス権があるため、問題はsymfonyに関連しているようです。

このコードだけを実行すると、うまくいきます:

session_start();
$_SESSION['x'] = 4234;
session_write_close();

symfonyがセッションの作成に失敗する理由や提案はありますか?

17
timg

PHP7では、カスタムセッションハンドラーのセッション処理がより厳密になっています。 symfonyのwriteメソッド用のカスタムセッションハンドラーは、何らかの理由でfalseを返します。以前は、これはエラーをトリガーしませんでしたが、現在はエラーをトリガーします。

どのカスタムセッションハンドラーを使用しているかについては多くの情報がないため、ほとんどの場合trueを返すように見えるため、可能であれば別のカスタムセッションハンドラーを設定することをお勧めします。

以下に、さまざまなセッションハンドラーSymfonyを示します。これらのほとんどは、MemcacheのハンドラーとWriteCheckSessionHandlerを除いて、明示的にtrueを返すようです。

https://github.com/symfony/symfony/tree/582f4753a343f230fbe18b4e9a0747d48351ddfb/src/Symfony/Component/HttpFoundation/Session/Storage/Handler

編集:

Snc Redis Bundleセッションハンドラーについて言及したので、本当に最新バージョンを使用していますか? 1年前、書き込み時に常にtrueを返すように変更されました。

https://github.com/snc/SncRedisBundle/blob/master/Session/Storage/Handler/RedisSessionHandler.php

[〜#〜]更新[〜#〜]

バグをPHP=)に送信して、将来のバージョンでより有用なエラーメッセージを見つけられるかどうかを確認します(投票するか、バグレポートにコメントを残してください)。

https://bugs.php.net/bug.php?id=7107

10
Clay

一部の検索結果でリストの一番上に表示され、Symphonyを使用していないためにこのスレッドが見つかった場合-これは私の場合に発生しました。セッションハンドラの書き込みメソッドが_bool - true on success_を返すことを確認してください。

Php session_set_save_handler のドキュメントではこれについて触れていません。ただし、 SessionHandlerInterface のドキュメントには記載されています。

戻り値(通常、成功した場合はTRUE、失敗した場合はFALSE)。この値は、処理のためにPHPに内部的に返されます。

以前のバージョンのPHPでは、何も返さなくてもエラーにはなりませんでした。 PHP 7.0)なので、何も返さないとエラーが発生します:Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp)

PHPの将来のバージョンでは、やや明確なメッセージが発行されるように見えます。_Failed to write session data using user defined save handler._

Symphonyを使用している場合-Chris Banksからの回答は、元の問題に対するより完全でより有用なソリューションを提供します。

5
Steve E.

問題が解決したことをうれしく思います-これらのエラーを受け取った誰かがこのスレッドにつまずく場合、明確にするために別のメモを追加したいと思います:エラーは明らかにフレームワークドライバーやその構成の問題で始まり、これが最新に更新される理由ですブランチは問題を解決しました。 PHPがSymfony Redisセッションドライバを使用しようとしたため、設定の問題により、php.iniのsess.save_pathに戻されたため、エラーメッセージ自体が発生しました。これが理由です= PHPディレクトリに書き込めませんでした-php.ini sess.save_path(ファイル)でユーザーsave_handler(Redis)を使用しようとしました。デフォルトにフォールバックする場合は、 php.iniのsess.save_handler設定も使用する必要がありますどちらにしても、この場合のエラー自体は実際の問題を示していません。

2
DrBlueSpruce

Apache PHP7からPHP7-FPMに移行したときにも同じ問題が発生しました。私にとっての唯一の修正は、Symfonyアプリのvarディレクトリに移動し、そこにあるすべてのファイルを削除し、必要に応じてvarの権限を修正することでした。chmod777。その後、アプリのURLをリロードし、準備完了です。その後、symfonyはすべてのキャッシュ、ログ、セッションなどを再作成します。

0
KungFuMonkey