Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
1

Запуск из одного PHP скрипта другого, не дожидаясь его завершения

05.11.2018, 15:36. Просмотров 903. Ответов 17
Метки нет (Все метки)

Добрый день. Имеется php скрипт registratot.php и calculate.php.

Как мне вызывать выполнение calculate.php в registrator.php. При этом registrator.php не должен дожидаться окончания выполнения calculate.php.


Другими слова, один сервер посылает на мой сервер запрос. Мне дается 10 секунд на то, чтобы вернуть строку "ok". Но, перед тем как вернуть эту строку, выполняется один скрипт, который может затянуться до 15-20 секунд. Хочу запускать этот скрипт в фоновом режиме, не дожидаясь окончания выполнения, отправлять "ok".
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2018, 15:36
Ответы с готовыми решениями:

Вызов php скрипта из другого скрипта
Есть такой код echo ('<img src="d.php?q='.$f.'&s='.$z0.'" width="50%">'); Т.е. передаем скрипту...

Запуск PHP скрипта
Как запустить PHP скрипт из консоли. Например, есть файл file.php, мне нужно чтобы при нажатие...

Запуск PHP скрипта по ssh
Здравствуйте. Плаваю в вопросе запуска php скрипта через cron. Для начала решил проверить,...

Запуск perl скрипта из php
Привет друзья! Прошу сразу не пинать. т.к. опробовал просто все варианты запуска perl скрипта из...

Запуск php скрипта без web сервера
Здраствуйте, имеется php скрипт. Нужно что б он запускался на локальной машине без установленого...

17
Para bellum
Эксперт PHP
4152 / 3087 / 999
Регистрация: 06.01.2011
Сообщений: 9,021
05.11.2018, 17:51 2
Запустите задачу в фоне с помощью exec.

Добавлено через 53 секунды
Т.е. вместо include запустите скрипт с помощью Linux-команды.
0
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
05.11.2018, 18:50  [ТС] 3
Буду благодарен за образец использования команды, ибо когда я использовал
PHP
1
exec('calculate.php > /dev/null &')
то ничего не получилось
0
Jewbacabra
Эксперт PHP
3511 / 2918 / 1304
Регистрация: 24.04.2014
Сообщений: 8,870
05.11.2018, 20:23 4
Цитата Сообщение от D Apache Посмотреть сообщение
exec('calculate.php > /dev/null &')
Плохая идея так делать. Лучше реализовать какую-либо систему очередей, даже самую примитивную: 1 скрипт записывает задачу в таблицу, другой раз в минуту запускается и берет из таблицы задачи, выполняет и удаляет их.
0
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
05.11.2018, 20:50  [ТС] 5
Ну тогда у меня проблемой будет, то что придется долго ждать ответ. В частности у меня это необходимо для бота. На сообщение он должен реагировать как можно быстрее (считать, выполнять какую-либо функцию).

Скрипт стоял на кроне, выполняясь каждую минуту, тем самым чтобы дождаться ответа нужно было дождаться начала следующей минуты. Пытался ускорить ответ следующим образом (имитировал крон на каждые пол секунды):
PHP
1
2
3
4
5
6
7
for($i = 0; $i < 120; $i++)
{
$values = Db::get('.....');
$result = myFunction($values);
sendMessage($result);
unsleep(500000);
}
Но фиг его знает, это не дало никакого ускорения.
0
Jodah
Эксперт PHP
2777 / 2429 / 1035
Регистрация: 01.08.2012
Сообщений: 8,570
05.11.2018, 22:36 6
Цитата Сообщение от D Apache Посмотреть сообщение
unsleep
Такой функции нет, есть usleep.
0
Jewbacabra
Эксперт PHP
3511 / 2918 / 1304
Регистрация: 24.04.2014
Сообщений: 8,870
05.11.2018, 22:43 7
D Apache, vps или хостинг?
0
Para bellum
Эксперт PHP
4152 / 3087 / 999
Регистрация: 06.01.2011
Сообщений: 9,021
06.11.2018, 06:56 8
Цитата Сообщение от D Apache Посмотреть сообщение
Скрипт стоял на кроне, выполняясь каждую минуту, тем самым чтобы дождаться ответа нужно было дождаться начала следующей минуты.
CRON можно не использовать. Для системы очередей, как правило, используется daemon (только нужно следить за его состоянием, чтобы перезапускался, если умирает; есть специальные программы для этого).

Добавлено через 2 минуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Плохая идея так делать.
Что-то я сплоховал.
0
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
06.11.2018, 16:41  [ТС] 9
По поводу unsleep, да это тут ошибся при написании.

Использую хостинг.
0
tgarl
356 / 350 / 80
Регистрация: 15.02.2012
Сообщений: 1,336
06.11.2018, 17:04 10
Лучший ответ Сообщение было отмечено D Apache как решение

Решение

Крон не всегда удобно использовать из-за его временной ограниченности запуска, демона писать, тоже так себе затея, его контролировать нужно.
у меня в проекте такой вариант используется
PHP
1
2
3
4
5
6
...
$nextarr='randstring='.$requestArr['randstring'];
    $nextarr.='&action='.$action;
...
    exec("/usr/bin/wget --post-data '".$nextarr."' -O - -q  http://site.ru/app/set_calk.php? > /dev/null &");
...
т.е. в $nextarr я собрал данные от которых зависит вызов и отдельно его запустил, когда он закончится мне уже не важно, в этом скрипте я уже отдал статус что все хорошо и забыл про это.
Единственное чтобы контролировать хоть как-то приходится лог вести: собрал данные, отправил, и в вызываемом файле отметка что все обработано. это из-за того что бывают ошибки в данных.
1
Jewbacabra
Эксперт PHP
3511 / 2918 / 1304
Регистрация: 24.04.2014
Сообщений: 8,870
06.11.2018, 17:07 11
tgarl, этот вариант ничем не отличается от указанного выше exec('calculate.php > /dev/null &'). Так делать не хорошо.
0
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
06.11.2018, 19:34  [ТС] 12
Крон не всегда удобно использовать из-за его временной ограниченности запуска, демона писать, тоже так себе затея, его контролировать нужно.
у меня в проекте такой вариант используется

PHP
1
2
3
4
5
6
...
$nextarr='randstring='.$requestArr['randstring'];
    $nextarr.='&action='.$action;
...
    exec("/usr/bin/wget --post-data '".$nextarr."' -O - -q  http://site.ru/app/set_calk.php? > /dev/null &");
...
т.е. в $nextarr я собрал данные от которых зависит вызов и отдельно его запустил, когда он закончится мне уже не важно, в этом скрипте я уже отдал статус что все хорошо и забыл про это.
Единственное чтобы контролировать хоть как-то приходится лог вести: собрал данные, отправил, и в вызываемом файле отметка что все обработано. это из-за того что бывают ошибки в данных.
А как у тебя $nextarr используется в set_calk.php?
0
tgarl
356 / 350 / 80
Регистрация: 15.02.2012
Сообщений: 1,336
07.11.2018, 09:38 13
Цитата Сообщение от Jewbacabra Посмотреть сообщение
этот вариант ничем не отличается от указанного выше
Да, но это пример привел для указания, что так можно и в боевом проекте.
Так делать не хорошо.
Поясните причину. Писать демона, который будет постоянно крутиться, писать дополнительный скрипт который будет проверять, а не отвалился ли демон, так как любой чих и демон перестал работать.(возможно если на bash его делать или еще чем-то, то все по другому, но с php у меня остались только негативные впечатления) и все это ради нескольких запросов в день.
А как у тебя $nextarr используется в set_calk.php?
это обычные реквест-данные
0
Jewbacabra
Эксперт PHP
3511 / 2918 / 1304
Регистрация: 24.04.2014
Сообщений: 8,870
07.11.2018, 10:27 14
tgarl, нехорошо поскольку этот процесс становится дочерним для менеджера процессов php (apache или php-fpm), который не расчитан на такое поведение, и никто не гарантирует что это будет работать всегда (php-fpm например кидается варнингами на такие процессы). Также нет никакого контрооя за этими процессами. Для серьезных прректов в бою такое не допустимо.
Есте же готовые нормальные менеджеры очередей типа RabbitMQ.
0
D Apache
0 / 0 / 0
Регистрация: 08.03.2017
Сообщений: 11
07.11.2018, 11:11  [ТС] 15
Всем спасибо. Пока решил эту проблему так:
PHP
1
 exec('php test.php '.$user.' '.$message.' > /dev/null 2>/dev/null &');
0
tgarl
356 / 350 / 80
Регистрация: 15.02.2012
Сообщений: 1,336
07.11.2018, 11:50 16
Есте же готовые нормальные менеджеры очередей типа RabbitMQ.
только для этого уже нужно разбираться как установить на сервер программу, как ее настроить, умение работать с консолью... а это уже несколько иной уровень знаний
0
Jewbacabra
Эксперт PHP
3511 / 2918 / 1304
Регистрация: 24.04.2014
Сообщений: 8,870
07.11.2018, 11:54 17
tgarl, это уровень знаний любого адекватного специалиста
0
tgarl
356 / 350 / 80
Регистрация: 15.02.2012
Сообщений: 1,336
08.11.2018, 10:01 18
Можете считать меня неадекватным сколько угодно, но я с вами не соглашусь. Это всего лишь уровень к которому нужно стремиться. Потому как с cерверами программист php разбираться не должен. Так же он не должен хорошо знать верстку и дизайн или к примеру asp. Это все разные области. Стремиться к саморазвитию и познанию других систем да, это хорошо. Но для работы с другими языками или системами есть другие специалисты. Просто сейчас работодатели ходят видеть универсалов, а большинству приходится если хотят работать идти на поводу из-за страха если я скажу что это ко мне не относится, мое место займет другой кто скажет "есть, будет сделано" и увы так и будет.
1
08.11.2018, 10:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2018, 10:01

Запуск одного скрипта из другого
Всем привет! Возникла интересная проблема. Мой скрипт содержит цикл, в котором должен вызываться...

Выполнить php скрипт внутри другого php скрипта
Добрый день. Есть два скрипта: outer.php и inner.php. В каком-то месте внутри outer.php нужно...

Запуск одного скрипта одновременно несколько раз
Здравия. Запускаю в 1 вкладке браузера index.php &lt;?php sleep(10); echo 'complete'; ?&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru