资讯专栏INFORMATION COLUMN

PHP造日志轮子的经验

Gemini / 623人阅读

摘要:对于的扩展开发是心有余而力不足,所以只能放弃心爱的,自己来造个简单的日志轮子了。以上是故事背景,下面开始讲造轮子的收获。以上四步看似走了一圈冤枉路,但是学习到的经验还是很值得分享的。

最近准备升级PHP7,发现同时使用yaf和seaslog扩展时会导致流量上升时php-fpm子进程的crash,在php-fpm.log中可以看到以下warning记录,最终引起请求中断。

WARNING: [pool www] child 15148 exited on signal 6 (SIGABRT) after 337.885989 seconds from start

经过动手实验,发现只要加载了seaslog.so,即使不调用它的方法,仍然存在上述问题,推测是seaslog扩展的RINIT和RSHUTDOWN里面的处理有问题,但是检查不出来是什么问题。对于PHP的扩展开发是心有余而力不足,所以只能放弃心爱的seaslog,自己来造个简单的日志轮子了。

以上是故事背景,下面开始讲造轮子的收获。

第一步,简单地实现功能,对文件进行写操作。

$fp = fopen($file, "a");
fwrite($fp, $log);
fclose($fp);

第二步,考虑文件锁,高并发场景下有可能会把日志写乱。

$fp = fopen($file, "a");
if (flock($fp, LOCK_EX)) {
    fwrite($fp, $log);
    flock($fp, LOCK_UN);
}
fclose($fp);

第三步,考虑到写日志只是一个很简单的应用场景,不需要考虑读文件时的数据一致性,为了提高效率我们可以改良一下这个文件锁。假设程序所在的文件系统的块的空间大小是4096字节,小于这个这个长度的日志可以直接写文件,否则要先抢占文件锁再写文件。

$fp = fopen($file, "a");
if (strlen($log) <= 4096) {
    fwrite($fp, $log);
} else if (flock($fp, LOCK_EX)) {
    fwrite($fp, $log);
    flock($fp, LOCK_UN);
}
fclose($fp);

If handle was fopen()ed in append mode, fwrite()s are atomic (unless the size of string exceeds the filesystem"s block size, on some platforms, and as long as the file is on a local filesystem). That is, there is no need to flock() a resource before calling fwrite(); all of the data will be written without interruption.

第四步,如果我们的日志长度几乎全是小于4096字节,可以退回到第一步的代码,而且还有一个选择,和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

file_put_contents($file, $log, FILE_APPEND);

以上四步看似走了一圈冤枉路,但是学习到的经验还是很值得分享的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21460.html

相关文章

  • PHP程序员如何优雅搬砖

    摘要:这是年前的最后一篇文章,本章来聊一聊程序员如何优雅的搬砖搬砖既为达到目的,不断重复某项工作的行为,其实与造轮子一样,不谋而合基础这里的基础并非单指其技术能力,技术底蕴,更有意体现程序员在初期不断重复的工作而获得的感想与意识。 showImg(https://segmentfault.com/img/bVbnSFx?w=800&h=444); 我一生的文章都会放在这里,我的博客,我希望每...

    妤锋シ 评论0 收藏0
  • 【Copy攻城狮日志】踩坑小程序之can't read property 'of

    摘要:根据当时的情境,是在微信开发者工具中删掉该小程序然后重新载入就解决了,大家给出的结论是微信小程序开发者工具的。 Created 2019-4-2 22:17:34 by huqiUpdated 2019-4-2 23:17:34 by huqishowImg(https://segmentfault.com/img/bVbqOLH?w=1526&h=818); ↑开局一张图,故事全靠编...

    hsluoyz 评论0 收藏0
  • PHP相关

    摘要:的机器学习库的机器学习库,包括算法交叉验证神经网络等内容。在即将到来的大会上,她将和大家分享在机器学习领域的全新可能。入门总结入门相关,如安装配置基本使用等。 基于 Swoole 开发 PHP 扩展 Swoole-1.9.7 增加了一个新特性,可以基于 Swoole 使用 C++ 语言开发扩展模块,在扩展模块中可以注册 PHP 内置函数和类。现在可以基于 Swoole 来编写 PHP ...

    lewinlee 评论0 收藏0
  • Android OkHttp 史上最优雅设置baseUrl

    前言 RxHttp截止本文发表已经推广了4个礼拜,目前已经有了141个star,如下: showImg(https://user-gold-cdn.xitu.io/2019/5/20/16ad5f3b6d10d9be); 其中一文,Android 史上最优雅的实现文件上传、下载及进度的监听更是得到了大神刘皇叔微信公众号的推送,欢迎读者关注刘皇叔微信公众号「刘望舒」,每天都有精彩的文章推送,真的很棒...

    番茄西红柿 评论0 收藏0

发表评论

0条评论

Gemini

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<