我做一些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);
}
但仍我无法解释为什么我在第一种情况下得到访问错误,因此等待评论!
您究竟在哪里得到“访问被拒绝”错误?什么是确切的错误信息? –
'file_put_contents()'被阻塞。直到文件关闭,脚本才会完成。 – rid
这是错误:警告:fopen(js/test.txt)[function.fopen]:未能打开流:权限在C:\ wamp \ www中拒绝(我尝试使用标准fopen和file_put_contents,同样的问题) – albanx