php - exec () выполняется в фоновом режиме [дубликат]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

Теперь, когда NullReferenceException выбрано (или необработанно), отладчик остановится ( помните правило, указанное выше?) в строке, на которой произошло исключение. Иногда ошибка может быть легко обнаружена.

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

. Найдите время, необходимое для понимания причина исключения. Проверьте нулевые выражения. Проверьте предыдущие выражения, которые могли бы привести к таким нулевым выражениям. Добавьте контрольные точки и, по мере необходимости, пройдите через программу. Используйте отладчик.


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

78
задан Jason Plank 13 October 2011 в 13:43
поделиться

8 ответов

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

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');

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

126
ответ дан jitter 28 August 2018 в 08:08
поделиться

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

Если нет, я бы посоветовал запустить очередь сообщений, например, beanstalkd / gearman / amazon sqs.

2
ответ дан Alfred 28 August 2018 в 08:08
поделиться

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

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
20
ответ дан Brent Baisley 28 August 2018 в 08:08
поделиться

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

1
ответ дан chaos 28 August 2018 в 08:08
поделиться

Используйте команду PHP popen, например ::

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));

. Это создаст дочерний процесс, и скрипт выйдет в фоновом режиме, не дожидаясь выхода.

8
ответ дан Jason Plank 28 August 2018 в 08:08
поделиться

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

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

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.

Подробное объяснение вы можете найти здесь: http://oytun.co/response-now-process-later

11
ответ дан Oytun Tez 28 August 2018 в 08:08
поделиться

Для windows вы можете использовать:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);

Примечание:

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

[COM_DOT_NET]
extension=php_com_dotnet.dll
1
ответ дан Pedro Lobito 28 August 2018 в 08:08
поделиться

Вы всегда можете отправлять через AJAX страницу, вызывающую shell_exec ().

-2
ответ дан zacharydanger 28 August 2018 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: