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

2016 年 7 月 12 日
 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 都没有错误记录 我应该如何调试?

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

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

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

其实用 java 或 c 一下午就写出来了 即使没基础 有基础几分钟
kookxiang
2016 年 7 月 12 日
会不会是内存炸了被怼了?
Grant06
2016 年 7 月 12 日
@william23 报错才会有输出
william23
2016 年 7 月 13 日
@Grant06 是啊,就是没报错,但是断了,就搞不懂了,每次记录的 log 位置都不一样,无从查证啊

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

https://study.congcong.us/t/291917

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

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

© 2021 V2EX