Я искал несколько вопросов, подобных этому, но я не нашел ответа, подходящего для меня, особенно для системы Windows.
Я установил PHP и Apache на Windows-машине. У меня есть приложение, которое вызывает Page1.php. В Page1 я выполняю некоторый код, и в определенный момент я хотел бы запустить другой скрипт php, назовем его Script.php асинхронно. Мне не нужно передавать какой-либо параметр этому второму сценарию — если бы это могло быть полезно, но это не обязательно — и мне не нужно ждать завершения сценария, потому что я не хочу сохранять общение с пользователем, так как скрипт выполняет много операций с файлами и может длиться довольно долго.
Я видел и пробовал ответы, основанные на exec, popen, shell, system и т. Д. … но я не нашел подходящий для меня, может быть, потому что я работаю на Windows. У них есть некоторые решения, которые я попробовал без всякого успеха:
exec('php script.php &> /dev/null &');
shell_exec('php script.php &> /dev/null &');
system('php script.php &> /dev/null &');
php script.php &> /dev/null &`
Схема может быть более или менее следующей:
page1.php
<?php
echo "Hello World";
echo "\n";
....
if ($var>$var2) {
HERE CALL SCRIPT.PHP ASYNC
}
...
?>
script.php
<?php
...
...
?>
То, что вы называете «асинхронным», на самом деле не является асинхронным. Вы делаете вызов для другого сценария, чтобы выполнить в случае $var > $var2
и это называется if-statement
,
Если ваш скрипт должен быть в другом файле, вы можете попробовать использовать include
, include_once
или же require
или же require_once
:
if ($var > $var2) {
include "Script.php";
}
Остальное зависит от Script.php.
Скопировано из комментариев php.net страница исполнителя:
Это выполнит $ cmd в фоновом режиме (без окна cmd) без PHP
ожидая его завершения, как на Windows, так и на Unix.
<?php
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
?>
Я не проверял это сам, но это было похоже на то, о чем я думал.
Вы также можете посмотреть на этот stackoverflow вопрос для более подробной информации (может помочь).