PHP 7.0.22中fopen/fwrite/fclose无报错但未生成文件求助
问题排查与解决思路
看起来你遇到了个挺典型的LAMP环境文件写入问题——资源句柄正常返回,但目标文件就是不生成,还没抛出异常。结合你给出的环境(Ubuntu 16.04 + PHP 7.0.22),我来梳理下最可能的原因和解决步骤:
1. 优先排查:目录权限问题(LAMP环境头号元凶)
Apache默认以www-data用户运行,你得确保这个用户对/var/www/dropbox目录有写入权限:
- 先检查目录的权限和归属:
ls -ld /var/www/dropbox - 如果输出里所有者/组不是
www-data,执行命令修改:sudo chown www-data:www-data /var/www/dropbox - 要是权限不足,调整目录权限(尽量避免用
777,推荐755或775):sudo chmod 755 /var/www/dropbox
2. 为什么try-catch没抓到异常?
PHP的fopen、fwrite这类文件操作函数默认只会抛出警告,不会触发Exception,所以你的try-catch根本抓不到错误。先打开错误提示,看看隐藏的警告信息:
在代码开头加上:
error_reporting(E_ALL); ini_set('display_errors', 1);
运行后就能看到具体的失败原因(比如权限不足、目录不存在等)。
3. 代码逻辑的潜在问题
- 循环条件
$x <= $inputFileCount会导致多执行一次循环(比如$inputFileCount=3时,x会从0跑到3,共4次),虽然这不会导致文件不生成,但属于逻辑冗余,建议改成$x < $inputFileCount。 - 你循环里直接写
fwrite($tempFile, $fileNames);:如果$fileNames是数组,fwrite会把它转成字符串"Array"写入;如果$fileNames是空值,文件会变成空文件,但至少应该生成。可以改成遍历数组元素的写法:for ($x = 0; $x < $inputFileCount; $x++) { if (isset($fileNames[$x])) { fwrite($tempFile, $fileNames[$x] . PHP_EOL); // 加换行方便查看内容 } }
4. 其他可能性排查
- 目录是否存在:如果
/var/www/dropbox目录本身不存在,fopen的w模式不会自动创建目录,会直接失败(但你得到了资源句柄,大概率目录是存在的,还是确认下)。 - open_basedir限制:检查php.ini里的
open_basedir配置,如果限制了PHP只能访问特定目录,而/var/www/dropbox不在列表里,也会导致写入失败。 - 磁盘空间/inode满了:用
df -h检查磁盘空间,df -i检查inode是否耗尽,这两种情况也会导致文件写不进去。
优化后的示例代码
结合上面的排查点,调整后的代码可以更健壮:
error_reporting(E_ALL); ini_set('display_errors', 1); try { $targetDir = "/var/www/dropbox"; $tempFilePath = $targetDir . "/temp.lst"; // 先验证目录状态 if (!is_dir($targetDir)) { throw new Exception("目标目录 $targetDir 不存在"); } if (!is_writable($targetDir)) { throw new Exception("目标目录 $targetDir 无写入权限"); } // 打开文件并检查资源 $tempFile = fopen($tempFilePath, "w"); if (!$tempFile) { throw new Exception("无法打开临时文件 $tempFilePath"); } echo "tempfile=" . $tempFile . "<br>"; // 写入内容(假设$fileNames是数组) for ($x = 0; $x < $inputFileCount; $x++) { if (isset($fileNames[$x])) { fwrite($tempFile, $fileNames[$x] . PHP_EOL); } } fclose($tempFile); echo "文件写入成功!"; } catch (Exception $e) { echo "错误信息: " . $e->getMessage(); }
内容的提问来源于stack exchange,提问作者OtagoHarbour
相关产品推荐
相关产品推荐

