Php 在一个命令提示窗口中启动多个长期运行的后台进程?

Php 在一个命令提示窗口中启动多个长期运行的后台进程?,php,windows,batch-file,cmd,Php,Windows,Batch File,Cmd,我只想从shell启动一系列后台进程。就这些 以下是一个名为start_servers的批处理文件中的内容: @ECHO OFF call setenv START "" /B xampp\apache_start.bat START "" /B xampp\mysql_start.bat START "" /B php start_daemon.php echo Server started 当我双击批处理文件来运行它时,一切正常。我在一个窗口中获得所有3个进程的输出。 但是,如果我在同一个

我只想从shell启动一系列后台进程。就这些

以下是一个名为start_servers的批处理文件中的内容:

@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
START "" /B php start_daemon.php
echo Server started
当我双击批处理文件来运行它时,一切正常。我在一个窗口中获得所有3个进程的输出。 但是,如果我在同一个目录中启动shell,输入'start_servers.bat'并点击enter,它可以正常运行apache_start和mysql_start,但是php脚本'start_daemon'似乎没有运行,但我会输出'Server start'

但最奇怪的是,如果我再次按enter键,那么php start_daemon.php就会运行! 就好像在我的键盘上键入了“php start_daemon.php”,但我看不见它。 当我按enter键时,显示如下:

[cwd]> start_servers.bat
...

[cwd]>Websocket Server started
Listening on: 0.0.0.0:9000
Master socket: Resource id #7
请注意“[cwd]>服务器启动”部分,就像我作为命令输入的一样

我花了一整天的时间来解决这个问题,这让我发疯了

请帮忙

编辑:

我只是尝试了一些其他的事情,但我还是得到了同样的结果。 如果我将.bat缩减为“START”“/bphpstart\u daemon.php”,或者如果我只是在命令行中键入它,我会得到相同的结果。第一次返回,什么也没有。第二次返回,它运行

我还尝试了以下方法:

START "" /B node test.js
START "" /B node test.js
结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
我所期望的是:

this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>
此外:

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
最后:

START "" /B python3 test.py
结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
到底发生了什么事?它们都将结果输出到我输入命令的行中,我认为这是有意义的,因为终端在将控制权交还给我之前没有等待开始调用完成,然而,PHP脚本要求我再次点击return,而Python3脚本要求2次返回! 这一点也不直观。我再次请求帮助。这简直要了我的命

编辑2:

如果我运行'START”“/B/WAIT php START_daemon.php'或'php START_daemon.php',那么很明显,脚本会立即运行,并按预期运行,但它会冻结shell,并要求我启动一个新的shell,以便输入任何进一步的命令。 我计划通过node或php运行多个后台进程,但实际上我只能在单个CMD终端中运行一个


我只是想重新表述一下这个问题,希望能得到一些回复,如果这有帮助的话…

在启动PHP脚本之前,您是否尝试过暂时化

@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
timeout 5 >nul
START "" /B php start_daemon.php
echo Server started

在启动PHP脚本之前,您是否尝试过暂时化

@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
timeout 5 >nul
START "" /B php start_daemon.php
echo Server started
尝试将它们全部分组。 换句话说,就像这样:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
START "" /B php start_daemon.php
echo Server started)
顺便说一下,如果您在命令提示符下复制/粘贴整个内容,它将运行第一行,然后按enter键,它将运行最后一行。当然,最好的做法是在运行以下命令时使用批处理文件:D

附言。 谢谢,我需要知道如何在后台运行东西。xD

更新:

在每一个之后添加一个简单/超时:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
timeout 1 >NUL
START "" /B xampp\mysql_start.bat
timeout 1 >NUL
START "" /B php start_daemon.php
timeout 1 >NUL
echo Server started)
尝试将它们全部分组。 换句话说,就像这样:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
START "" /B xampp\mysql_start.bat
START "" /B php start_daemon.php
echo Server started)
顺便说一下,如果您在命令提示符下复制/粘贴整个内容,它将运行第一行,然后按enter键,它将运行最后一行。当然,最好的做法是在运行以下命令时使用批处理文件:D

附言。 谢谢,我需要知道如何在后台运行东西。xD

更新:

在每一个之后添加一个简单/超时:

(@ECHO OFF
call setenv
START "" /B xampp\apache_start.bat
timeout 1 >NUL
START "" /B xampp\mysql_start.bat
timeout 1 >NUL
START "" /B php start_daemon.php
timeout 1 >NUL
echo Server started)

我有点晚了,但我会尝试解释至少一些行为

使用

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
可以预期,因为启动
节点测试.js
异步通常需要一些时间来启动。
因此,cmd.exe已完成
Start
命令,并在
节点test.js
能够打印文本之前打印提示

为了避免这种情况,您需要在
启动后添加延迟

我建议使用批处理文件进行此测试

@echo off
START "" /B node test.js
timeout /t 1 > nul
php或python需要更多的
ENTER
键,这似乎是您的系统的局部问题。
因为一个简单的测试可以在Windows7上运行

@echo off
start "" /b php -r "echo 1;"
start "" /b php -r "echo 2;"
start "" /b php -r "echo 3;"
timeout /t 1 > nul
运行多次,我会得到不同的输出

213
123


这是可以预料的,因为每个php实例都是异步启动的。

我有点晚了,但我将尝试至少解释一些行为

使用

结果:

C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>   [nothing again, I hit return]
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
C:\Users\hedge\Projects\PHPStorm\gpstudios>this is a test
可以预期,因为启动
节点测试.js
异步通常需要一些时间来启动。
因此,cmd.exe已完成
Start
命令,并在
节点test.js
能够打印文本之前打印提示

为了避免这种情况,您需要在
启动后添加延迟

我建议使用批处理文件进行此测试

@echo off
START "" /B node test.js
timeout /t 1 > nul
php或python需要更多的
ENTER
键,这似乎是您的系统的局部问题。
因为一个简单的测试可以在Windows7上运行

@echo off
start "" /b php -r "echo 1;"
start "" /b php -r "echo 2;"
start "" /b php -r "echo 3;"
timeout /t 1 > nul
运行多次,我会得到不同的输出

213
123


这是可以预料到的,因为每个php实例都是异步启动的。

恐怕没有帮助。还在为这个扯我的头发。。。如果我只运行由“START”“/B php START_daemon.php”组成的脚本,它在第一次返回时仍然不会运行。在它运行之前,我必须第二次按回车键。恐怕没用。还在为这个扯我的头发。。。如果我只运行由“START”“/B php START_daemon.php”组成的脚本,它在第一次返回时仍然不会运行。在它运行之前,我必须第二次点击回车键。在这种情况下,一个块很可能会改变antyhing。在这种情况下,一个块很可能会改变antyhing。