exec — Как PHP может выполнить фоновую задачу?

Чтобы попробовать фоновый тест, я создаю 3 файла:

Index.html (Ответственный за вызов php-файла с помощью ajax)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Background Task Manager</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>

Press The Button To execute a Background Task...
<br>
<button id="perform">Perform Task</button>

</body>

<script>

$( document ).ready(function() {

$( "#perform" ).click(function() {
submitAjax();
});

function submitAjax() {
$.ajax({
url: 'test.php',
type: "post",
data: '',
success: function (data) {
alert(data);
}
});
}

});

</script>

</html>

test.php (Файл, который вызывает другой файл, используя фоновый метод)

<?php

//Perform Background Task

exec("C:/wamp/bin/php/php5.6.35/php.exe C:/wamp/www/background/file.php");

echo "Process Started";

?>

file.php (Файл, который будет выполняться в фоновом режиме)

<?php

//Create a File

sleep(20);

$content = "My Text File";
$fp = fopen("myText.txt","wb");
fwrite($fp,$content);
fclose($fp);

echo "File Created...";

?>

Идея была бы в следующем: Когда пользователь нажимает кнопку, в файл test.php делается запрос. Test.php вызовет фоновый запрос для file.php, сообщение («Процесс запущен») появится немедленно и через 20 секунд после создания файла в папке моего проекта.

Что происходит: Когда пользователь нажимает кнопку, я получаю сообщение «Процесс запущен» только через 20 секунд, т.е. запрос не выполняется в фоновом режиме.

Что я хочу, чтобы произошло: Когда пользователь нажимает кнопку, сразу появляется сообщение «Процесс запущен», а через 20 секунд php создает файл в папке моего проекта.

Как я могу решить эту проблему ?

1

Решение

попробуйте изменить:

exec("C:/wamp/bin/php/php5.6.35/php.exe C:/wamp/www/background/file.php");
echo "Process Started";

чтобы:

ob_start();
echo "Process Started";
ob_end_flush();
ob_flush();
flush();
exec("C:/wamp/bin/php/php5.6.35/php.exe C:/wamp/www/background/file.php");

связанный ответ на ваш вопрос:
продолжить обработку php после отправки http ответа

и вы также можете использовать include Вместо того, чтобы использовать exec()
это будет как:

start();
echo "Process Started";
ob_end_flush();
ob_flush();
flush();

include 'background/file.php';

так что вы можете отлаживать file.php более легко

1

Другие решения

Зачем вам вызывать exec из php для запуска оболочки php? Это не имеет никакого смысла. Почему бы просто не вызвать файл file.php напрямую?

Эхо находится внутри вызова ajax, поэтому его не видно; он будет возвращен как вывод страницы. Обычно для чего-то подобного вам необходимо использовать поле:

<?
<p class="Message"></p>
<button onclick="foo()">Click Me</button>
<script>
function foo(){
$('.Message').text('Processing.....');
$.post('file.php',function(ret){
// ret should tell us what happened
if (ret == "ok")
$('.Message').text('File Created');
else
$('.Message').text('File Not Created. Something Went Wrong');
});
}
</script>

file.php должен создать файл, проверить, что файл создан, и вернуть значение, которое можно проверить, чтобы убедиться, что операция прошла успешно. Вы также можете проверить ret в console.log, чтобы увидеть, нет ли у вас каких-либо синтаксических ошибок или исключений. Все, что выводится на страницу, будет возвращено, поэтому вы можете не получить чистый ответ. Лучше всего иметь file.php echo что-то:

if ($file_created)
echo "ok";
else
echo "failed";
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector