求教:线上环境的一个方法每隔两天左右会断,而且没有 log 可查,怎么办?

2016-07-12 12:00:10 +08:00
 william23

问题是这样的,代码如下:

ignore_user_abort();
set_time_limit(0);
$interval=300;

do{
    sleep($interval);
    $file1 = date("Y-m-d",time()).'.txt';
    $content=file_get_contents($file1);
    $fp = fopen($file1, 'w');
    $content .= "\r\nstart".date("Y-m-d H:i:s",time());
    fwrite($fp, $content);
    fclose($fp);
}while(true);

线上的环境是 nginx php5
这个会每隔两天左右,也没有固定值,然后 log 会断,然后查询线上的 nginx 的 error.log 和 php5 的的 error.log 都没有错误记录 我应该如何调试?

2521 次点击
所在节点    PHP
13 条回复
lianz
2016-07-12 12:18:04 +08:00
极可能是文件内容过大,超出内存限制了。
file_put_contents 只适合小文件,写 log 的话该换 append fwrite 了
gdtv
2016-07-12 12:22:48 +08:00
代码里去掉循环,弄个 crontab 定时执行,会不会好些?
xujif
2016-07-12 12:31:42 +08:00
file_put_contents 本身就有 flag 参数可以指定为 append 不需要读出来再写。 没有 log 的话看看有没有 core 文件,可能就是崩掉了
pubby
2016-07-12 12:38:26 +08:00
为啥要全部读出来,你只是在文件最后加点东西而已。
直接 file_put_contents($file,"\r\nstart".date("Y-m-d H:i:s",time()),FILE_APPEND) 就行了

如果这个脚本可能会有多个运行实例,最好用 FILE_APPEND | LOCK_EX
william23
2016-07-12 13:01:51 +08:00
@lianz
@xujif
@pubby
你们说的是有这个可能性,我会排查的,但是这只是个 demo ,这个情况其实还有一个版本,是插入到数据库的,然后作为 log ,但是也是会断,网上的资料是说应该是某一处产生了报错,但是我 try catch 捕获不到这个错误
william23
2016-07-12 13:03:01 +08:00
@gdtv 你说的的确是这样子好些,现在只是暂时这样子,如果没有排查出来的话,我想下次就直接用 crontab 了。
Grant06
2016-07-12 14:25:17 +08:00
php xxxxx.php > 日志文件
hl
2016-07-12 14:33:49 +08:00
装个监控吧兄弟
william23
2016-07-12 15:06:20 +08:00
@Grant06 这个日志文件是空的
rekulas
2016-07-12 15:54:59 +08:00
php 常驻本身就不稳定,你这逻辑这么简单,建议用 shell 或者 java 或者 c

比如最简单的开个 screen ,写个 shell 每秒请求一下搞定,缺点是重启就没了

其实用 java 或 c 一下午就写出来了 即使没基础 有基础几分钟
kookxiang
2016-07-12 17:20:48 +08:00
会不会是内存炸了被怼了?
Grant06
2016-07-12 18:58:17 +08:00
@william23 报错才会有输出
william23
2016-07-13 14:34:13 +08:00
@Grant06 是啊,就是没报错,但是断了,就搞不懂了,每次记录的 log 位置都不一样,无从查证啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/291917

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX