代码之家  ›  专栏  ›  技术社区  ›  Phill Pafford

基于Debian的系统会话在特殊cron中在30分钟内终止,如何覆盖?

  •  10
  • Phill Pafford  · 技术社区  · 14 年前

    一直在拔我的头发,试图找出为什么我的疗程在30分钟内被终止/杀死/销毁。看起来基于debian的系统有一个特殊的cron运行,它忽略所有php.ini和apache配置,并在30分钟内终止所有空闲会话。

    克伦路线: /etc/cron.d/php5

    在cron内部:

    # /etc/cron.d/php5: crontab fragment for php5
    #  This purges session files older than X, where X is defined in seconds
    #  as the largest value of session.gc_maxlifetime from all your php.ini
    #  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime
    
    # Look for and purge old sessions every 30 minutes
    09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
    

    我不擅长配置和设置主机,但我不是系统管理员。有人能帮我重写/编辑/更改/重新配置这个以便我可以设置更长的值吗?我认为3小时很好,但我想了解这些变化,因此如果上级希望缩短/延长会话时间,我将记录如何配置这些变化。

    感谢你对这方面的帮助

    编辑: 添加/usr/lib/php5/maxlifetime代码

    #!/bin/sh -e
    
    max=1440
    
    for ini in /etc/php5/*/php.ini; do
            cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
            [ -z "$cur" ] && cur=0
            [ "$cur" -gt "$max" ] && max=$cur
    done
    
    echo $(($max/60))
    
    exit 0
    

    所以它会搜索所有php.ini文件,找到最大的值,并将其与1440(24分钟)进行比较。

    以下是php.ini文件

    /etc/php5/apache2/php.ini
    session.gc_maxlifetime = 1440 
    
    /etc/php5/cgi/php.ini
    session.gc_maxlifetime = 1440
    
    /etc/php5/cli/php.ini
    session.gc_maxlifetime = 1440
    

    但是为什么我的脚本会在30分钟而不是24分钟内被杀死呢?

    编辑第2页: cron每30分钟运行一次,这就是为什么会话看起来每隔30分钟就要终止的原因。 但也可能是24到54分钟,仅供参考

    同时查看以下代码: /usr/lib/php5/maxlifetime 它取了最高值,在我的测试中,我试图降低阈值来加速这种情况。

    看起来我只需要在php.ini文件上增加一个小时的测试。

    6 回复  |  直到 14 年前
        1
  •  8
  •   Emil Vikström    14 年前

    编辑文件 /usr/lib/php5/maxlifetime

    该值应以秒为单位。这个文件实际上也会检查你的php.ini,所以我不知道为什么它不适合你。

        2
  •  3
  •   al.    14 年前

    这是serverfault.com的一个问题。

    然而,变化 session.gc_maxlifetime 在里面 /etc/php5/apache2/php.ini 或者-如果你没有阿帕奇2,一个-另一个 /etc/php5/*/php.ini 文件夹。剧本 /usr/lib/php5/maxlifetime 然后将对这些文件中的任何一个设置使用最大值。

    编辑 maxlifetime 不会有帮助,至少直到 php5-common 包再次更新。

        3
  •  1
  •   Khawar    12 年前

    您可以提供自己的会话路径 session.save_path 一起使用不同的处理程序 session.save_handler

    但是,您需要提供适当的机制来管理不需要的会话文件。

    在我的 php.ini

    ; NOTE: If you are using the subdirectory option for storing session files
    ;       (see session.save_path above), then garbage collection does *not*
    ;       happen automatically.  You will need to do your own garbage
    ;       collection through a shell script, cron entry, or some other method.
    ;       For example, the following script would is the equivalent of
    ;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
    ;          cd /path/to/sessions; find -cmin +24 | xargs rm

    我最近遇到了这个问题,因为我使用的是php和 mod_fcgid 有习俗 session.save_路径 对于每个虚拟主机。

        4
  •  1
  •   Martin Seitl    10 年前

    如果您来这里是因为您的cron每30分钟(09和39)发送一次错误,那么您的系统日志和/或邮箱中可能有similar错误:

    [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm
    PHP Fatal error: Directive 'allow_call_time_pass_reference' is no longer available in PHP in Unknown on line 0
    

    原因可能是你 upgraded your Debian to Wheezy 你有旧的入口 /etc/php5/apache2/php.ini .

    我不得不对以下几行进行评论,错误就消失了。

    • 允许呼叫时间通过参考
    • 注册long_数组

    我写这篇文章是因为如果你搜索错误信息,这是Google最热门的搜索结果之一,它可能会影响许多用户/管理员,这些用户/管理员在多个版本中维护他们的Debian安装。

    附言:这对我很有帮助: http://vernontbludgeon.com/blog/archives/2013/10/debian-php-session-garbage-collection-maxlifetime-fails-when-php.ini-has-obsolete-directives.html

        5
  •  0
  •   Brunis    12 年前

    就在你的php5 cronjob片段中:

    每隔30分钟查找并清除旧会话

    如果脚本的执行时间不超过30分钟,则脚本清除24分钟的旧会话并不重要:)

        6
  •  0
  •   MaheshPatade    10 年前

    使用下面的cron删除未使用的会话。

    39 20***root[-x/usr/lib/php5/maxlifetime]&&[-d/var/lib/php5]&&find/var/lib/php5/-depth-mindepth 1-maxdepth 1-type f-cmin+$(/usr/lib/php5/maxlifetime)-print0 xargs-r-0 rm

    推荐文章