Php 读取时文件被截断

Php 读取时文件被截断,php,file,Php,File,我正在共享主机(fwrite)上用PHP编写一些json结果文件 然后我读取这些文件以提取json结果(文件内容) 有时(可能是一千多个字节中的一个),当我读取此文件时,它会被截断:我只能读取文件前32768字节的倍数 我添加了一些代码来复制/粘贴我正在读取的文件,以防json字符串无效,然后我得到了两个不同的文件:原始文件写得正确,因为它包含一个有效的json字符串,而复制的文件只包含原始文件的开头,大小为x*32768字节 你知道会出现什么问题以及如何解决吗?(我不知道如何进一步调查) 谢谢

我正在共享主机(fwrite)上用PHP编写一些json结果文件

然后我读取这些文件以提取json结果(文件内容)

有时(可能是一千多个字节中的一个),当我读取此文件时,它会被截断:我只能读取文件前32768字节的倍数

我添加了一些代码来复制/粘贴我正在读取的文件,以防json字符串无效,然后我得到了两个不同的文件:原始文件写得正确,因为它包含一个有效的json字符串,而复制的文件只包含原始文件的开头,大小为x*32768字节

你知道会出现什么问题以及如何解决吗?(我不知道如何进一步调查)


谢谢

如果没有示例代码,就不可能给出“修复我的代码”的答案,但是在进行文件写入/读取类编程时,您应该遵循一个简单的过程(从描述中可以看出,这个过程缺少一个相当关键的步骤!)

首先,写入一个临时文件(您正在写入一个文件,但在这里写入一个临时文件很重要-否则,您可能会有竞争条件……;)

在php中实现这一点的简单方法

$yourData = "whateverYourDataIs....";
$goodfilename = 'whateverYourGoodFileNameIsForYourData.json';
$tempfilename = 'tempfile' . time(); // MANY ways to do this (lots of SO posts on it - just get a unique name every time you write ('unique' may not be needed if you only occasionally do a write, but it is a good safety measure to avoid collisions and time() works for many programs.)
// Now, use $tempfilename in your fwrite.
$fwrite = fwrite($tempfilename,$yourData);
if ($fwrite === false) { 
    // the write failed, so do whatever 'error' function you may need
    // since it failed, there should be no file, but not a bad idea to attempt to delete it
    unlink ($tempfile);
}
else {
    // the write succeeded, so let's do a 'sanity check' on the file to make sure it is good JSON (this is a 'paranoid' check, but "better safe than sorry", right?)
    if(json_decode($tempfile)){
        // we know the file is good JSON, so now RENAME (this is really fast, so collisions are almost impossible)  NOTE: see http://php.net/manual/en/function.rename.php comments for some potential challenges and workarounds if you have trouble with rename.
        rename($tempfilename,$goodfilename);
    }
    // Now, the GOOD file will contain your new data - and those read issues are gone! (though never say 'never' - it may be possible, but very unlikely!)  
}
这可能是/不是你的直接问题,你必须适应它以适应你的代码,但作为一个安全因素——也是避免冲突的一个好方法,它应该让你100%的阅读成功,我相信这就是你所追求的!)


如果这没有帮助,那么需要一些直接代码来提供更完整的答案。

正如@UlrichEckhardt评论所建议的,这是由于读/写并发问题。我试图读取一个正在写入的文件。我解决了这个问题,只是在尝试再次读取文件之前等待

也许如果您向我们展示一些演示这种情况的代码,它将帮助我们您可能有一个竞争条件。并发读写容易失败。是的,这需要你提取一个。@UlrichEckhardt是的,这就是为什么我想看代码:)@Ulrich,我认为你完全正确,我必须有并发问题;我可能正在读取正在写入的文件。我会沿着这条路走,让你知道。谢谢我还没有合成代码来复制它,如果我仍然无法修复pb,我将尝试构建一个(基本上,我有一个php代码进行fwrite;一些javascript代码定期发送ajax请求以检查文件是否包含结果;一些php代码通过文件内容读取文件并显示结果(如果可用)@Ulrich,谢谢,如果我得到的json无效,如果我在再次尝试读取文件之前等待,那么我似乎不再有问题了。因此,这实际上是一个并发读/写访问文件的问题