Php exec не ждать завершения windows

Обновлено: 04.07.2024

У меня есть эта проблема: На веб-сервере ISS установлен Windows 7 x64 professional, Zend сервер. Выполнение этой команды под php:

$output is empty, $err=1. Таким образом, exec не получает выходные данные, похоже, есть некоторые ошибки. Php disable_functions пуст, php не в безопасном режиме, является стандартным, я отмечаю все опции Кажется, это общие ошибки, даже поиск в Google не дает результатов.

Пожалуйста, напишите каждому его опыт и возможные решения или обходные пути.

В соответствующих разделах Руководства по PHP есть несколько публикаций, например этот :

  1. Предоставлено разрешение на выполнение пользователю Интернета на c: \ windows \ system32 \ cmd.exe.
  2. Предоставлено всем -> полный доступ к каталогу, в котором записан пакетный файл.
  3. Предоставлено всем -> Полный доступ ко всему каталогу c: \ cygwin \ bin и его содержимому.
  4. Предоставил пользователю Интернета права «входить как пакет».
  5. Указан полный путь к каждому исполняемому файлу.
  6. Протестировал эти скрипты, запущенные из командной строки на сервере, и они работают просто отлично.
  7. Убедитесь, что% systemroot% \ system32 находится в системном пути.

Есть еще несколько вариантов exec и shell_exec справочные страницы. Возможно, следуя им, вы получите его и будете работать на вас.

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

Как бы странно это ни звучало, я обнаружил, что самый надежный способ выполнения любых процессов, связанных с Windows, - это использование объектной модели компонентов. Вы сказали, что мы должны поделиться нашим опытом, верно?

$ me слышит, как люди смеются

Вы уже обрели самообладание?

Итак, сначала мы создадим COM-объект:

Тогда мы просто запустим то, что нужно запустить.

Круто! Теперь, это будет зависать, пока все не закончится в этом двоичном файле. Итак, что нам нужно сделать сейчас, это получить вывод.

Есть и другие вещи, которые вы можете сделать - выяснить, что это за идентификатор процесса, код ошибки и т. д. Хотя этот пример для Visual Basic, он основан на той же схеме.

РЕДАКТИРОВАТЬ: после нескольких исследований единственный способ выполнить команду DIR, который я вижу, заключается в следующем:

Итак, вы можете попробовать мое решение, используя:

Вы также можете использовать функцию proc_open, которая дает вам доступ к stderr, коду возврата и стандартному выводу.

Интересной особенностью proc_open по сравнению с другими функциями, такими как popen или exec, является то, что он предоставляет параметры, специфичные для платформы Windows, например:

Я знаю, что выбрал ответ, так как должен это сделать, но я все еще не понимаю, почему он не работает на моем компьютере, но я нашел запасное решение (с помощью proc_open), используя другой метод:

Надеюсь, это кому-нибудь поможет.

У меня была такая же проблема, и после я провожу много часов и чашку кофе

Просто отключите контроль учетных записей (UAC) в Windows 7 короткий путь: P C: \ Windows \ System32 \ UserAccountControlSettings.exe и выберите «Никогда не уведомлять»

и php exec () работают отлично!

Я использую: Apache версия: 2.2.11
Версия PHP: 5.2.8
Windows 7 SP1 32bit

С наилучшими пожеланиями! : D

Он отлично работает в Windows 8.1 64bit с включенным UAC.

В целях безопасности ваш сервер может иметь ограниченный доступ к команде "exec". В этом случае, возможно, вам следует обратиться в хостинговую компанию, чтобы снять это ограничение (если оно есть).

Вы можете проверить разрешения пользователя IIS для cmd.exe

Если в выводе указана строка (COMPUTERNAME = имя вашего компьютера):

Это означает, что у пользователя нет прав на выполнение cmd.

Вы можете добавить разрешения на выполнение с помощью команды:

Если вы находитесь на компьютере с Windows и пытаетесь запустить такой исполняемый файл:

и нет выходных данных или ваш файл не запущен, попробуйте следующее:

Это должно работать.

Это особенно удобно, если вы используете относительный путь из папки, в которой находится скрипт, например:

И не забудьте chdir () вернуться в исходную папку, если вам нужно запустить другие программы.

Кроме того, вы можете попробовать использовать popen вместо exec. Это дает больше контроля, потому что вы можете отделить запуск процесса от чтения вывода:

У меня есть задача интенсивного процесса, которую я хотел бы запустить в фоновом режиме.

пользователь нажимает на страницу, запускается PHP скрипт, и, наконец, на основе некоторых условий, если требуется, то он должен запустить сценарий оболочки, например:

В настоящее время я использую shell_exec, но для этого требуется, чтобы скрипт ждал вывода. Есть ли способ выполнить команду, которую я хочу без ожидание его завершения?

Как насчет добавления.

обратите внимание, что это также избавляется от stdio и stderr.

Это выполнит команду и отключится от запущенного процесса. Конечно, это может быть любая команда. Но для теста вы можете создать php-файл с командой sleep(20).

вы также можете мгновенно вернуть свой вывод клиенту и продолжить обработку вашего PHP-кода после этого.

Это метод, который я использую для долгожданных вызовов Ajax, которые не будут иметь никакого эффекта на стороне клиента:

В Windows 2003, чтобы вызвать другой скрипт без ожидания, я использовал это:

это работает только после предоставления разрешений на изменение cmd.exe - добавить чтение и выполнение для IUSR_YOURMACHINE (Я также установил write для Deny).

использовать PHP , например:

это создаст дочерний процесс, и сценарий будет excute в фоновом режиме, не дожидаясь вывода.

конечно, windows вы можете использовать:

Примечание:

если вы COM ошибка, добавьте расширение в свой php.ini и перезапустите apache :

Что будет работать, но вы должны быть осторожны, чтобы не перегружать свой сервер, потому что он будет создавать новый процесс каждый раз, когда вы вызываете эту функцию, которая будет работать в фоновом режиме. Если только один параллельный вызов одновременно, то это обходное решение будет выполнять эту работу.

Если это вне веб-страницы, я рекомендую генерировать какой-то сигнал (возможно, удаление файла в каталоге) и задание cron забрать работу, которую нужно сделать. В противном случае мы, скорее всего, попадем на территорию использования pcntl_fork() и exec() изнутри процесса Apache, и это просто плохое Моджо.

вы всегда можете опубликовать некоторый AJAX на странице, которая вызывает shell_exec ().

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

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


Другими слова, один сервер посылает на мой сервер запрос. Мне дается 10 секунд на то, чтобы вернуть строку "ok". Но, перед тем как вернуть эту строку, выполняется один скрипт, который может затянуться до 15-20 секунд. Хочу запускать этот скрипт в фоновом режиме, не дожидаясь окончания выполнения, отправлять "ok".

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Запуск внешнего скрипта и ожидание его завершения
поможите советом, а лучше кодом )) мне нужно запустив скрипт (VBS) отследить его PID в процессах и.


Запуск одного скрипта из другого
Какими кодами активируются скрипты в VBS? Есть скрипты, нужно чтобы эти файлы запускались другим.

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

Запуск одного скрипта из другого
Понимаю, что из названия темы мало, что понятно. Постараюсь объяснить на примере. Ситуация такая.

Запустите задачу в фоне с помощью exec.

Добавлено через 53 секунды
Т.е. вместо include запустите скрипт с помощью Linux-команды.

Буду благодарен за образец использования команды, ибо когда я использовал
Плохая идея так делать. Лучше реализовать какую-либо систему очередей, даже самую примитивную: 1 скрипт записывает задачу в таблицу, другой раз в минуту запускается и берет из таблицы задачи, выполняет и удаляет их.

Скрипт стоял на кроне, выполняясь каждую минуту, тем самым чтобы дождаться ответа нужно было дождаться начала следующей минуты. Пытался ускорить ответ следующим образом (имитировал крон на каждые пол секунды):

Скрипт стоял на кроне, выполняясь каждую минуту, тем самым чтобы дождаться ответа нужно было дождаться начала следующей минуты.

CRON можно не использовать. Для системы очередей, как правило, используется daemon (только нужно следить за его состоянием, чтобы перезапускался, если умирает; есть специальные программы для этого).

Добавлено через 2 минуты

По поводу unsleep, да это тут ошибся при написании.

Решение

Крон не всегда удобно использовать из-за его временной ограниченности запуска, демона писать, тоже так себе затея, его контролировать нужно.
у меня в проекте такой вариант используется
т.е. в $nextarr я собрал данные от которых зависит вызов и отдельно его запустил, когда он закончится мне уже не важно, в этом скрипте я уже отдал статус что все хорошо и забыл про это.
Единственное чтобы контролировать хоть как-то приходится лог вести: собрал данные, отправил, и в вызываемом файле отметка что все обработано. это из-за того что бывают ошибки в данных. tgarl, этот вариант ничем не отличается от указанного выше exec('calculate.php > /dev/null &') . Так делать не хорошо.

Крон не всегда удобно использовать из-за его временной ограниченности запуска, демона писать, тоже так себе затея, его контролировать нужно.
у меня в проекте такой вариант используется

т.е. в $nextarr я собрал данные от которых зависит вызов и отдельно его запустил, когда он закончится мне уже не важно, в этом скрипте я уже отдал статус что все хорошо и забыл про это.
Единственное чтобы контролировать хоть как-то приходится лог вести: собрал данные, отправил, и в вызываемом файле отметка что все обработано. это из-за того что бывают ошибки в данных. этот вариант ничем не отличается от указанного выше Да, но это пример привел для указания, что так можно и в боевом проекте.
Поясните причину. Писать демона, который будет постоянно крутиться, писать дополнительный скрипт который будет проверять, а не отвалился ли демон, так как любой чих и демон перестал работать.(возможно если на bash его делать или еще чем-то, то все по другому, но с php у меня остались только негативные впечатления) и все это ради нескольких запросов в день.
tgarl, нехорошо поскольку этот процесс становится дочерним для менеджера процессов php (apache или php-fpm), который не расчитан на такое поведение, и никто не гарантирует что это будет работать всегда (php-fpm например кидается варнингами на такие процессы). Также нет никакого контрооя за этими процессами. Для серьезных прректов в бою такое не допустимо.
Есте же готовые нормальные менеджеры очередей типа RabbitMQ. Есте же готовые нормальные менеджеры очередей типа RabbitMQ. только для этого уже нужно разбираться как установить на сервер программу, как ее настроить, умение работать с консолью. а это уже несколько иной уровень знаний tgarl, это уровень знаний любого адекватного специалиста Можете считать меня неадекватным сколько угодно, но я с вами не соглашусь. Это всего лишь уровень к которому нужно стремиться. Потому как с cерверами программист php разбираться не должен. Так же он не должен хорошо знать верстку и дизайн или к примеру asp. Это все разные области. Стремиться к саморазвитию и познанию других систем да, это хорошо. Но для работы с другими языками или системами есть другие специалисты. Просто сейчас работодатели ходят видеть универсалов, а большинству приходится если хотят работать идти на поводу из-за страха если я скажу что это ко мне не относится, мое место займет другой кто скажет "есть, будет сделано" и увы так и будет.

Запуск одного скрипта perl из другого
Всем привет, почему то перестала работать конструкция вида: my $name = "test"; our $iparam =.

Запуск скрипта для анализа папки и запуска другого скрипта
Мне нужно написать скрипт, который каждую секунду (или 5 сек) сканировал определенную папку на.

Как из одного скрипта изменить переменную (int) другого скрипта?
У меня есть два скрипта (money который отвечает за общее количество денег и CarBuy который отвечает.

Unity - Обращение к публичным полям одного скрипта из другого скрипта
Привет. Скрипты пишу на CSharp. В одном gameObject (назовем его HelloObject) есть два скрипта -.


Запуск скрипта после завершения торрента transmission на Ubuntu Server 16.04
Здравствуйте! Суть вопроса: На домашнем Nas под управлением Ubuntu Server 16.04 установлен и.

ехес("файл.ехе параметры"); // исполняется около 5 секунд

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/B] [command/program]
[parameters]

"title" Title to display in window title bar.
path Starting directory
B Start application without creating a new window. The
application has ^C handling ignored. Unless the application
enables ^C processing, ^Break is the only way to interrupt
the application
I The new environment will be the original environment passed
to the cmd.exe and not the current environment.
MIN Start window minimized
MAX Start window maximized
SEPARATE Start 16-bit Windows program in separate memory space
SHARED Start 16-bit Windows program in shared memory space
LOW Start application in the IDLE priority class
NORMAL Start application in the NORMAL priority class
HIGH Start application in the HIGH priority class
REALTIME Start application in the REALTIME priority class
ABOVENORMAL Start application in the ABOVENORMAL priority class
BELOWNORMAL Start application in the BELOWNORMAL priority class
WAIT Start application and wait for it to terminate
command/program
If it is an internal cmd command or a batch file then
the command processor is run with the /K switch to cmd.exe.
This means that the window will remain after the command
has been run.

If it is not an internal cmd command or batch file then
it is a program and will run as either a windowed application
or a console application.

parameters These are the parameters passed to the command/program


If Command Extensions are enabled, external command invocation
through the command line or the START command changes as follows:

non-executable files may be invoked through their file association just
by typing the name of the file as a command. (e.g. WORD.DOC would
launch the application associated with the .DOC file extension).
See the ASSOC and FTYPE commands for how to create these
associations from within a command script.

When executing an application that is a 32-bit GUI application, CMD.EXE
does not wait for the application to terminate before returning to
the command prompt. This new behavior does NOT occur if executing
within a command script.

When executing a command line whose first token is the string "CMD "
without an extension or path qualifier, then "CMD" is replaced with
the value of the COMSPEC variable. This prevents picking up CMD.EXE
from the current directory.

When executing a command line whose first token does NOT contain an
extension, then CMD.EXE uses the value of the PATHEXT
environment variable to determine which extensions to look for
and in what order. The default value for the PATHEXT variable
is:

Notice the syntax is the same as the PATH variable, with
semicolons separating the different elements.

Читайте также: