php开发讨论 加入小组

1个成员 1个话题 创建时间:2014-10-10

高并发下PHP写文件日志丢失

发表于 2015-09-01 696 次查看

最近碰到一个问题,PHP在写后台业务的时候,会并发很多,由于当中有大量的日志,在写文件的时候,经常碰到日志丢失的问题,由此编写了此类,在解决高并发日志丢失的情况下,同时对打开的文件句柄做一次缓存来提高程序运行效率

<?php

/**

 * Created by PhpStorm.

 */

class LogFileUtil {

 

    public static $fileHandlerCache;

    private static $initFlag = false;

    private static $MAX_LOOP_COUNT = 3;

 

    private static function init() {

        self::$initFlag = true;

        register_shutdown_function(array("LogFileUtil", "shutdown_func"));

    }

 

    /**

     * 输出到文件日志

     * @param $filePath 文件路径

     * @param $msg  日志信息

     * @return int

     */

    public static function out($filePath, $msg) {

        if (!self::$initFlag) {

            self::init();

        }

        return self::internalOut($filePath, $msg);

    }

 

    /**

     * @param $filePath

     * @param $msg

     * @param $loop

     * @return int

     */

    private static function internalOut($filePath, $msg, $loop = 0) {

        //以防一直添加失败造成死循环

        if ($loop > self::$MAX_LOOP_COUNT) {

            $result = 0;

        } else {

            $loop++;

            $fp = self::$fileHandlerCache["$filePath"];

            if (empty($fp)) {

                $fp = fopen($filePath, "a+");

                self::$fileHandlerCache[$filePath] = $fp;

            }

            if (flock($fp, LOCK_EX)) {

                $result = fwrite($fp, $msg);

                flock($fp, LOCK_UN);

            } else {

                $result = self::internalOut($filePath, $msg, $loop);

            }

        }

        return $result;

    }

 

    function shutdown_func() {

        if (!empty(LogFileUtil::$fileHandlerCache)) {

            if (is_array(LogFileUtil::$fileHandlerCache)) {

                foreach (LogFileUtil::$fileHandlerCache as $k => $v) {

                    if (is_resource($v))

                        //file_put_contents("close.txt",$k);

                        fclose($v);

                }

            }

        }

    }

}

 

发表回复
功能维护升级中,维护完成完后将再次开放,非常抱歉给您学习造成的不便。
话题作者
sanxialang
头衔:
活跃成员