file_put_contents访问拒绝了几个AJAX请求(但已同步)


file_put_contents access denied on several AJAX requests (but synchronized)?

我正在对一个php文件进行一些连续(递归)ajax请求,该文件将请求参数写入文件:

make_ajax(s)
{
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange=function()
 {
  if(this.readyState == 4 && this.status == 200)
  {
   if(s>0)
   make_ajax(s-1)
  }
 };
xhr.open('POST','write.php?s='+s+'&string=somelongstring',true);//url + async/sync
...
xhr.send(null);
}
make_ajax(15);//start request

write.php:

file_put_contents('test.txt',$_GET['s']);

似乎服务器返回到ajax请求,在它关闭text.txt文件之前,所以下一个ajax请求是由递归发送一个访问拒绝错误,因为似乎该文件仍然由以前的ajax请求打开(事件它已经返回)?我测试了这个脚本,即使async=false,但我得到了同样的错误?如何避免php脚本在关闭文件之前返回?

注意:我没有使用会话,我只是发送数据到服务器保存在一个文件中。

NOTE2:这里我做了一个简单的例子,实际上我使用这个方法通过ajax和mozSlice方法块上传文件。完整代码:

            function uploadFileXhr(o,start_byte)
            {
                var total=o.size;
                var chunk;
                var peice=1024 * 1024;//bytes to upload at once
                var end_byte=start_byte+peice;
                var peice_count=end_byte/peice;
                $('#debug').html(peice_count);
                var is_last=(total-end_byte<=0)?1:0;
                chunk=o.mozSlice(start_byte, end_byte);
                var xhr = new XMLHttpRequest();//prepare xhr for upload
                xhr.onreadystatechange=function()
                {
                    if(this.readyState == 4 && this.status == 200)
                    {
                        if(is_last==0)
                        {
                            uploadFileXhr(o,end_byte);
                        }
                    }
                };
                xhr.open('POST','upload.php',true);//url + async/sync
                xhr.setRequestHeader("Cache-Control", "no-cache");
                xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');//header
                xhr.setRequestHeader('Content-Type', 'multipart/form-data');//type for upload
                xhr.send(chunk);//send request of file 
            }
uploadFileXhr(file_input,0);//start recrusive call

upload.php:

$flag =($_GET['start']==0) ? 0:FILE_APPEND;
file_put_contents($remotePath.$add.$file_name, file_get_contents('php://input'),$flag);

NOTE3: OK实际上建立了一个解决方案来避免这个错误,在upload.php脚本:

        $flag =($_GET['start']==0) ? 0:FILE_APPEND;
        $file_part=file_get_contents('php://input');
        while(@file_put_contents($remotePath.$add.$file_name, $file_part,$flag)===FALSE)
        {
            usleep(50);
        }

但是我仍然不能解释为什么我在第一种情况下得到访问拒绝错误,所以等待评论!

目标文件(test.txt)中是否出现任何内容?也就是说,它是在发出第一个请求后失败还是立即失败?该错误提示服务器无法写入文件。这可能是因为其他进程正在使用该文件,也可能是因为web服务器没有对该文件的写权限。为了消除显而易见的问题,请确保您的web服务器实际上被允许写入文件。