资讯专栏INFORMATION COLUMN

PHP造日志轮子的经验

Gemini / 791人阅读

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

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

</>复制代码

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

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

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

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

</>复制代码

  1. $fp = fopen($file, "a");
  2. fwrite($fp, $log);
  3. fclose($fp);

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

</>复制代码

  1. $fp = fopen($file, "a");
  2. if (flock($fp, LOCK_EX)) {
  3. fwrite($fp, $log);
  4. flock($fp, LOCK_UN);
  5. }
  6. fclose($fp);

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

</>复制代码

  1. $fp = fopen($file, "a");
  2. if (strlen($log) <= 4096) {
  3. fwrite($fp, $log);
  4. } else if (flock($fp, LOCK_EX)) {
  5. fwrite($fp, $log);
  6. flock($fp, LOCK_UN);
  7. }
  8. fclose($fp);

</>复制代码

  1. 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() 功能一样。

</>复制代码

  1. 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元查看
<