Я загружаю большой XML-файл на PHP через curl (около 43 МБ), затем обрабатываю этот файл, проверяя данные и вставляя их в базу данных. Проблема заключается в том, что балансировщик нагрузки перестает посылать ответ пользователю через 5 минут, а скрипт PHP занимает приблизительно 20 минут. Я думал о запуске двух скриптов PHP параллельно. Один создает пустой файл на сервере, загружает и обрабатывает XML-файл, а в конце удаляет пустой файл. Другой PHP-скрипт запускается каждые 15 секунд и проверяет, все ли остается пустой файл. У меня возникли проблемы с запуском этих двух скриптов параллельно. Это мой код:Асинхронные методы на Php
$(document).ready(function() {
$(document).on("click", ".clickMe", function() {
var download = $.ajax({
async: true,
url: "/staff/import.php",
type: "post",
data: { getFile: true },
dataType: "json",
success: function (data) {
}
});
var serverStatus = true;
while (serverStatus === true) {
var checkDownload = $.ajax({
async: false,
url: "/staff/checkDownload.php",
type: "post",
dataType: "json",
data: { checkDownload: true },
success: function (returndata) {
if (returndata === false) {
serverStatus = false;
}
}
});
}
});
});
PHP Curl Скачать:
<?php
session_write_close();
touch(getcwd() . "downloading");
$curl = curl_init(); //
$post = array("uploadfile"=>"@" . getcwd() . "/tmp.xml");
curl_setopt($curl, CURLOPT_URL, "sftp://<host>/bigFile.xml");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)");
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($curl, CURLOPT_USERPWD, "<userName>:<password>");
file_put_contents(getcwd() . "/tmp.xml", curl_exec($curl));
curl_close($curl);
unlink(getcwd() . "downloading");
// process xml file
// insert into database
PHP проверка загрузки:
Для того, чтобы сделать два PHP скрипты, работающие параллельно, я прочитал, что мне нужно отключить сеансы [session_write_close();]
но еще один ждет, пока другой не закончит. Кто-нибудь может дать мне какой-нибудь свет, если я что-то неправильно делаю над своим кодом (Javascript или PHP) или знаю какой-либо другой подход? Благодаря
Я думаю, что это зависит от сервера, а не от php, как он будет выполнен. Apache делает это 1 на 1, насколько я знаю, - исправьте меня, если я ошибаюсь ... ваш большой скрипт для этого «блокировал» ваш стек исполнения –
Как о запуске задания в фоновом режиме на сервере и в форме системы «очереди» (возможно, даже с прогрессом?). Затем просто отправьте обратно «queueID», и когда элемент очереди будет завершен (проверьте с ajax каждую N-ю секунду), верните файл. – h2ooooooo
Это мое отношение к этому, тоже. Я написал для этого более длинный ответ. Вы думаете, что что-то может быть улучшено там @ h2ooooooo, я просто написал, что пришло мне в голову ... – baao