我正在对一个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服务器实际上被允许写入文件。