Tengo un formulario simple para cargar varios archivos.
<form id="myform" enctype="multipart/form-data"> <input id="files" name="files" type="file" class="form-control" multiple> </form>Cuando el usuario envía el formulario, subo cada archivo individualmente para seguir el progreso individualmente:
for (i=0; i<$('#files')[0].files.length; i++){ var file = $('#files')[0].files[i]; uploadFile(file, recipient, $row); }La parte principal de la función uploadFile():
// Pack the data var data = new FormData(); data.append("file", file); $.ajax({ url: 'upload.php', type: 'POST', data: data, cache: false, contentType: false, processData: false, xhr: function(){ var myxhr = $.ajaxSettings.xhr(); if (myxhr.upload){ // do more stuff } return myxhr; },Ahora, en mi archivo upload.php, me equivoqué al pensar que el archivo estaría en una variable POST pero aún se necesita acceder a través de $_FILES. Entonces, mi pregunta es, si desencadeno múltiples cargas, ¿podría encontrarme con alguna condición de carrera en la que el script php lea $_FILES y no contenga el archivo esperado? Debido a que no se llama a upload.php hasta que se haya cargado el archivo, entonces no estaría al tanto del estado actual de $_FILES, ¿verdad? ¿O estoy pensando demasiado en esto?
Al igual que cualquier otra solicitud HTTP, cada solicitud es completamente independiente. No entrarán en conflicto ni se causarán problemas entre sí (a menos que inicie tantos simultáneamente que el servidor simplemente no pueda hacer frente a la demanda).
Se lanza una nueva instancia del script PHP para tratar con cada solicitud de AJAX, que tiene su propia instancia separada de $_FILES para leer. El hecho de que esté utilizando AJAX para activar la solicitud es irrelevante; eso es completamente transparente para el servidor: no sabe (ni le importa) cómo se inició la solicitud.