Laravel 会话文件未从 framework/sessions 文件夹中清除

Posted

技术标签:

【中文标题】Laravel 会话文件未从 framework/sessions 文件夹中清除【英文标题】:Laravel Session files not cleaning from the framework/sessions folder 【发布时间】:2016-08-31 22:08:47 【问题描述】:

我在使用 Laravel 5.2 生产环境 (php 7.0.5) 的共享主机 (OVH pro)。

我正在使用 文件会话驱动程序,并且在我以前的主机上一切正常(使用相同的应用程序),但是自从我移至 OVH 后,会话文件不断被创建并且永远不会被 PHP 垃圾回收器删除。 我必须手动删除文件(每天创建超过 5000 个文件)。

我的config/session.php 文件设置正确:

'driver' => 'file',
'lifetime' => 120,
'lottery' => [2, 100],

我的文件夹storagestorage/frameworkstorage/framework/sessions都设置了0755权限。

我还覆盖了 php.ini,将这两行放在 config/session.php 的顶部

ini_set('session.gc_probability', '5');
ini_set('session.gc_divisor', '100');

phpinfo() 返回的结果似乎运行良好:

我联系了我的主机,但他们告诉我这一定与我的 Laravel 应用程序有关,他们无能为力。

编辑:我的会话工作正常,我的意思是每个访问者只创建一个文件。问题只是会话文件没有得到清理,即使有 777 权限。


即使我将 Laravel 会话抽奖设置为 100/100,文件仍然没有被删除:

    /*
    |--------------------------------------------------------------------------
    | Session Sweeping Lottery
    |--------------------------------------------------------------------------
    |
    | Some session drivers must manually sweep their storage location to get
    | rid of old sessions from storage. Here are the chances that it will
    | happen on a given request. By default, the odds are 2 out of 100.
    |
    */

    'lottery' => [100, 100],

编辑: OVH 托管细节: 我在 OVH 上使用多站点,并且包含每个站点的文件夹放置在我的 OVH 主机的路由中,而不是默认的 www 文件夹中。

出于安全原因,我这样做了,因为 www 文件夹可通过 mynickname.cluster005.ovh.net 公开访问,我不希望我的任何网站都可以从

公开访问

mynickname.cluster005.ovh.net/site1

mynickname.cluster005.ovh.net/site2...

(www\site1, www\site2...)。

所以我在想也许只有位于www 文件夹内的文件是可写的,可能不是外面的文件(在根目录下)?这可以解释我的文件没有被删除。我今晚做个测试,看看放在www\site1\storage\sessions的文件是否被删除。

【问题讨论】:

尝试在注销方法Session::flush()中添加这个; 这很聪明,但大多数人只是离开网站而不注销,我只会保存一打文件...... 你不能安排那个吗?不是我知道的最好的解决方案 安排一个 cron 作业也是我的计划,但这是我的第二个大问题 >***.com/questions/37061770/… 啊:我从来没有使用过调度,所以我帮不上忙,我希望你能解决这个问题 【参考方案1】:

有一些步骤你可以首先找到问题所在

    确保每个页面中的会话 ID 都是固定的(回显会话 ID)

如果每页都更改了会话 ID,则需要检查会话配置 域设置正确。

如果会话 id 没有改变,你可能需要将存储文件夹的 premision 更改为 777。

希望对你有帮助。

【讨论】:

我的会话工作正常,我的意思是每个访问者只创建一个文件。问题只是会话文件没有得到清理,即使有 777 权限。【参考方案2】:

如果您使用的是haproxy,请考虑以下答案:

会话文件可以由haproxy's http health checks创建。

    检查您的网络访问日志以进行固定间隔访问。

111.11.111.1 - - [28/Jul/2016:10:40:30 -0400] 200 "GET / HTTP/1.0" 4 "-" "-" "-"

111.11.111.1 - - [28/Jul/2016:10:40:32 -0400] 200 "GET / HTTP/1.0" 4 "-" "-" "-"

111.11.111.1 - - [28/Jul/2016:10:40:34 -0400] 200 "GET / HTTP/1.0" 4 "-" "-" "-"

    更新option httpchk GET / 以指向一些routes,您可以在haproxy.cfg 上将会话驱动程序设置为array

    添加Config::set('session.driver', 'array'); 行以禁用会话文件的创建。


参考:

https://laravel.com/docs/5.1/session#introduction https://serverfault.com/questions/792150/session-files-are-created-every-2-second-running-on-openshift-laravel-php-nginx https://github.com/laravel/framework/issues/726#issuecomment-30595774

【讨论】:

【参考方案3】:

转到config/session 并设置'lifetime' => 120,或者一个不太大的数字,这是会话持续的时间,以分钟为单位

【讨论】:

以上是关于Laravel 会话文件未从 framework/sessions 文件夹中清除的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu 14.04 上的 Laravel 5.1 会话问题

laravel5.5http会话机制

Laravel:从应用程序中注销/清除所有用户的所有会话

Laravel - 会话数据在注销/登录后仍然存在,即使对于不同的用户也是如此

Laravel 5 异步 AJAX 请求导致会话问题

文本未从 Laravel 中的 Summernote 存储