2011-10-15 76 views
4

我做一些consecutives(recrusive)Ajax请求的PHP文件写入请求参数到一个文件:file_put_contents访问被拒绝的几个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文件之前,因此由recrusive发送的下一个ajax请求会得到Access Denided错误,因为似乎该文件仍然由previrios ajax请求(它返回的事件)打开?我甚至用async = false测试了这个脚本,但是我得到了同样的错误?如何在关闭文件之前避免该php脚本返回?

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

NOTE2:在这里我做了一个简单的例子,在realty我使用这种方法上传文件的块与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); 

注3: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); 
     } 

但仍我无法解释为什么我在第一种情况下得到访问错误,因此等待评论!

+0

您究竟在哪里得到“访问被拒绝”错误?什么是确切的错误信息? –

+0

'file_put_contents()'被阻塞。直到文件关闭,脚本才会完成。 – rid

+0

这是错误:警告:fopen(js/test.txt)[function.fopen]:未能打开流:权限在C:\ wamp \ www中拒绝(我尝试使用标准fopen和file_put_contents,同样的问题) – albanx

回答

0

目标文件(test.txt)中是否出现任何内容?即它是否在之后发生第一个请求或立即失败?该错误表明服务器无法写入文件。这可能是因为某个其他进程正在使用该文件,或者因为Web服务器对该文件没有写入权限。只是为了消除这些明显的问题,确保您的Web服务器实际上被允许写入文件。

+0

是的,服务器无法读取文件几秒钟,我创建了一个解决方案(请参阅NOTE3),但是,我仍然不知道为什么会发生在使用wamp进行本地主机测试时。 – albanx