Что нового

Как запустить php скрипт в фоновом режиме? (1 Viewer)

Mr.S

Mr.S

Гуру
Owner
SkripTers TEAM
SEOшники
Регистрация
25 Дек 2019
Сообщения
91
Реакции
72
Нужно запустить затяжной по времени php скрипт в фоновом режиме, инициатор - клиент.
Запускать необходимо с помощью кода, а не комадной строки сервера.

К примеру: есть скрипт strict.php который выполняется примерно 1 минуту, если запускать обычным способом то клиенту прийдется дожидаться его завершения + создается нагрузка на сервер т.к. минуту будет висеть коннект веб сервера.

Сейчас запуск производится так:
JavaScript:
$('#btnpstid').on('click', function(){
$.ajax({
  url: '/mod/strict.php',
  success: function(data) {
   alert('Данные обновлены!')
  }
});
})
 
Ну, для этого нужна функция, которую нужно будет либо в саму себя, либо в интервал
Пример первый:
JavaScript:
function strictFunction() {
$.ajax({
  url: '/mod/strict.php',
  success: function(data) {
   alert('Данные обновлены!')
  }
});

setTimeout(strictFunction, 60000);
}


strictFunction();

Либо по второму примеру:
JavaScript:
function strictFunction() {
$.ajax({
  url: '/mod/strict.php',
  success: function(data) {
   alert('Данные обновлены!')
  }
});

}

setInterval(strictFunction, 60000);

Вместо 60000 свой таймер


В первом варианте нужно будет отдельно запустить функцию, во втором - подключить в функцию интервального действия
 
если запускать обычным способом то клиенту прийдется дожидаться его завершения
А это нужно только клиенту? Тогда ему в любом случае придется ждать пока всё исполниться
Если клиенту это не нужно, то настройка ignore_user_abort, чтобы работа скрипта не прерывалась при отключении клиента
 
Ну, для этого нужна функция, которую нужно будет либо в саму себя, либо в интервал
Пример первый:
JavaScript:
function strictFunction() {
$.ajax({
  url: '/mod/strict.php',
  success: function(data) {
   alert('Данные обновлены!')
  }
});

setTimeout(strictFunction, 60000);
}


strictFunction();

Либо по второму примеру:
JavaScript:
function strictFunction() {
$.ajax({
  url: '/mod/strict.php',
  success: function(data) {
   alert('Данные обновлены!')
  }
});

}

setInterval(strictFunction, 60000);

Вместо 60000 свой таймер


В первом варианте нужно будет отдельно запустить функцию, во втором - подключить в функцию интервального действия
Интервал это не то, оно просто запустит с задержкой. А надо запустить примерно как это делает крон, во время выполнения скрипта кроном спокойно можно пользоваться сайтом.
А это нужно только клиенту? Тогда ему в любом случае придется ждать пока всё исполниться
Если клиенту это не нужно, то настройка ignore_user_abort, чтобы работа скрипта не прерывалась при отключении клиента
Не то, тоже.
На хабре нашел в статейке варик через php-cli, но я в душе не е.. как с ним работать.
В случаях, когда долгие скрипты запускаются через веб-сервер, соединение клиента с этим самым веб-сервером остается открытым до тех пор, пока не отработает скрипт. Это не есть хорошо, т.к. задача веб-сервера как можно быстрее обработать запрос и отдать результат. Если же соединение остается висеть, то один из воркеров (процессов) веб-сервера на долгое время будет занят. А если одновременно будет запущено достаточно много таких скриптов, то они могут занять все (ну или почти все) свободные воркеры (для apache см. MaxClients), и веб-сервер просто не сможет обрабатывать другие запросы.

Поэтому следует при обработке запроса пользователя, запускать скрипт в фоновом режиме через php-cli, чтобы не нагружать веб-сервер, а пользователю отвечать что его запрос обрабатывается. При необходимости можно периодически проверять состояние обработки при помощи AJAX запросов.
 
Интервал это не то, оно просто запустит с задержкой. А надо запустить примерно как это делает крон, во время выполнения скрипта кроном спокойно можно пользоваться сайтом
тогда, смотри в сторону Web Worker https://developer.mozilla.org/ru/docs/Web/API/Web_Workers_API/Using_web_workers
 
  • Like
Реакции: Mr.S
На хабре нашел в статейке варик через php-cli, но я в душе не е.. как с ним работать.
Ну если оставлять большое количество воркеров не вариант, то может сделать вызов одного скрипта из другого?
наверное,
PHP:
exec("nohup php strict.php > /dev/null &");
должен сработать. Вызывающий скрипт должен продолжить работу, не дожидаясь пока отработает вызываемый скрипт.
 
Последнее редактирование:
  • Like
Реакции: Mr.S
Ну если оставлять большое количество воркеров не вариант, то может сделать вызов одного скрипта из другого?
наверное,
PHP:
exec("nohup php strict.php > /dev/null &");
должен сработать. Вызывающий скрипт должен продолжить работу, не дожидаясь пока отработает вызываемый скрипт.
Попробую, отпишусь
 

Пользователи, просматривающие данную тему

Верх