PHP脚本无报错突然终止求助:模拟weleakinfo.com功能运行超时
嘿,我来帮你搞定这个问题!运行40秒突然停掉,十有八九是超时或者资源限制在搞鬼,结合你要处理230个大文本文件的场景,咱们一步步拆解问题:
1. 首先排查PHP执行超时
默认情况下,PHP的max_execution_time通常是30秒左右,你运行到40秒刚好触发了超时终止。解决这个的办法很直接:
- 在脚本开头加上
set_time_limit(0);,0代表取消执行时间限制(如果服务器没开安全模式的话生效) - 如果你有权限改php.ini,也可以把
max_execution_time调大,比如设成300(5分钟),不过脚本内设置更灵活
2. 内存资源还是要留意
虽然你换成了fscanf()逐行读取,但如果你的逻辑里把所有匹配结果都存在数组里,或者有其他内存累积的操作,还是可能触发内存限制。建议:
- 每次匹配到目标邮箱后,直接输出结果或者写入临时文件,不要一直存在内存里
- 必要的话可以临时放宽内存限制:
ini_set('memory_limit', '-1');,不过这个要谨慎用,别搞垮服务器
3. 文件遍历的细节优化
230个文件逐个处理,要是没做好资源释放,也可能出问题:
- 用
glob('*.txt')来批量获取所有目标文件,比手动写1到230的循环更靠谱,也能避免文件名出错 - 每个文件处理完一定要用
fclose()关闭句柄,不然打开的文件句柄太多会耗尽服务器资源
给你一个优化后的示例代码
<?php // 解除执行时间限制 set_time_limit(0); // 临时放宽内存限制(按需使用) ini_set('memory_limit', '-1'); // 开启错误报告,方便排查隐藏问题(生产环境记得关掉display_errors) error_reporting(E_ALL); ini_set('display_errors', 1); // 假设从用户输入获取目标邮箱 $targetEmail = $_POST['email'] ?? ''; $foundRecords = []; // 获取所有1.txt到230.txt的文件 $files = array_filter(glob('*.txt'), function($file) { $num = preg_replace('/\D/', '', $file); return $num >=1 && $num <=230; }); foreach ($files as $file) { $handle = fopen($file, 'r'); if (!$handle) { echo "无法打开文件: {$file}<br>"; continue; } // 用fscanf逐行读取匹配格式 while (fscanf($handle, "%[^:]:%s\n", $email, $password) !== false) { if ($email === $targetEmail) { $foundRecords[] = "{$email}:{$password} (来自文件: {$file})"; // 如果你找到就想停止,可以直接跳出循环 // break 2; } } fclose($handle); // 必须关闭文件句柄! } if (!empty($foundRecords)) { echo "找到以下匹配记录:<br>"; foreach ($foundRecords as $record) { echo "- {$record}<br>"; } } else { echo "未找到该邮箱的泄露记录"; } ?>
额外要检查的点
- 服务器层面的超时:比如Apache的
Timeout配置、Nginx的fastcgi_read_timeout,如果服务器限制了请求超时时间,光改PHP的设置没用,得同步调整 - 错误日志:去服务器的PHP错误日志里看看有没有隐藏的报错,比如某些文件格式不规范导致
fscanf读取异常,只是没显示出来
内容的提问来源于stack exchange,提问作者kvothe
相关产品推荐
相关产品推荐

