Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中启动Windows进程并获取它';什么是PID?_Php_Windows - Fatal编程技术网

在PHP中启动Windows进程并获取它';什么是PID?

在PHP中启动Windows进程并获取它';什么是PID?,php,windows,Php,Windows,我好像没法让它工作 因此,我正在尝试为我的游戏编写一个脚本,该脚本连接到服务器,传递一些游戏名称/类型/玩家/等参数。然后服务器脚本根据需要设置游戏服务器的新实例,运行服务器的新实例,找到它运行的端口,并将所有信息发送回游戏 我已经完成了脚本需要执行服务器游戏exe的部分,并得到了它的PID(这样我就可以得到它使用的端口,等等) 服务器脚本是一个PHP脚本,用于执行服务器的新实例。(据我所知,PHP似乎是一个不错的选择) 脚本必须能够完成执行,同时保持游戏服务器在后台运行 能够同时运行多个游戏

我好像没法让它工作

因此,我正在尝试为我的游戏编写一个脚本,该脚本连接到服务器,传递一些游戏名称/类型/玩家/等参数。然后服务器脚本根据需要设置游戏服务器的新实例,运行服务器的新实例,找到它运行的端口,并将所有信息发送回游戏

我已经完成了脚本需要执行服务器游戏exe的部分,并得到了它的PID(这样我就可以得到它使用的端口,等等)

服务器脚本是一个PHP脚本,用于执行服务器的新实例。(据我所知,PHP似乎是一个不错的选择)


脚本必须能够完成执行,同时保持游戏服务器在后台运行

能够同时运行多个游戏服务器是必要的


我尝试过使用
proc\u open
,但它给出了错误的进程PID,这使得它毫无用处。(不过,它确实正确地执行了程序)

运行exec命令,它会给出正确的PID,但程序无法正常启动(只是显示一个空白的终端窗口,什么也不做)

运行run命令,它会正确地启动程序(在终端窗口中显示它应该显示的所有文本),但是,该命令不会返回PID


在这件事上的任何帮助都将不胜感激。我不确定我用
WScript.Shell->exec
命令做了什么错事,因为它没有正确执行,因此,如果您能在这方面提供帮助,我将不胜感激

如果可能的话,我想使用
proc\u open
方法,因为如果我们想将任何服务器内容移到*nix,它会更跨平台

谢谢你的时间,我希望一些聪明的人能给我指明正确的方向


PHP版本:5.4.3

开发人员计算机:Windows7Ultimate和SP1


服务器机器:Windows Server 2008 R2

我相信您可以通过这种方式获得您想要的结果,因为您是为Windows操作系统开发的

首先,将.exe作为服务运行。 (我相信这就是语法)

那么我相信你可以:

win32_start_service('SERVICENAME');

sleep(4);

$serviceStatus = win32_query_Service_status('SERVICENAME');
var_dump($serviceStatus);

// or
echo $serviceStatus[ProcessId];
PS-请考虑我没有测试这个。但我相信这会奏效。试试看


同时,请访问此链接以了解有关Windows服务的更多信息。

我设法获得了它。我使用proc_open执行,它返回运行的游戏服务器的PPID(cmd.exe可执行文件)

由于
start/b
exit是cmd.exe,一旦它执行了程序,应该具有该PPID的唯一东西就是游戏服务器,因此它的其余部分相对容易找到PID

当一次创建多个实例时,以及当多个实例已经在运行时,这种方法也有效

这是在proc_打开的情况下获取PID的结束脚本,如果其他人对此线程感到好奇,并且可能碰巧需要它:

<?php

    $startDir = "C:/Torque/My Projects/Grim/game";
    $runExe   = "$startDir/Grimwood.exe";
    $envars   = " -dedicated -mission \"core/levels/Empty Terrain.mis\"";

    $runPath = $runExe . $envars;

    chdir($startDir);

    $descriptorspec = array (
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
    );

    if ( is_resource( $prog = proc_open("start /b " . $runPath, $descriptorspec, $pipes, $startDir, NULL) ) )
    {
        $ppid = proc_get_status($prog)['pid'];
    }
    else
    {
        echo("Failed to execute!");
        exit();
    }

    $output = array_filter(explode(" ", shell_exec("wmic process get parentprocessid,processid | find \"$ppid\"")));
    array_pop($output);
    $pid = end($output);

    echo("\nProcess ID: $pid ; Parent's Process ID: $ppid\n");

    // returns right process
    $task = shell_exec("tasklist /fi \"PID eq $pid\"");
    echo("\n\nProcess: \n$task\n\n");

    // returns no process found
    $task = shell_exec("tasklist /fi \"PID eq $ppid\"");
    echo("\n\nParent Process: \n$task\n\n");

?>

路径中是否有空格?尝试在它们周围添加“”。我已经尝试过了,甚至没有遇到它们,但这似乎不是问题。下一个猜测(我不是windows专家):在前面添加CMD?这似乎是一个倒退。它似乎什么也没做。但感谢您的帮助:)找到了WScript.Shell->exec无法正常工作的原因。它不会运行基于控制台的应用程序。因此,WScript.Shell->run不会给出PID,proc_open也不会返回正确的PID。不知道现在该做什么。谢谢你的回复。我可以同时运行服务的多个实例吗?启动时是否可以将参数传递给服务?同时运行服务的多个实例。我不确定,你应该看看我提供给你的链接。我不为Windows环境开发,所以不确定。但是对于参数,您可以检查是否将参数传递给可执行文件。虽然我没有使用这种方法,但我已经进行了升级,因为它提供了一些有用的信息供以后使用。谢谢
sc create SERVICENAME binpath=PATH_TO_EXE
win32_start_service('SERVICENAME');

sleep(4);

$serviceStatus = win32_query_Service_status('SERVICENAME');
var_dump($serviceStatus);

// or
echo $serviceStatus[ProcessId];
<?php

    $startDir = "C:/Torque/My Projects/Grim/game";
    $runExe   = "$startDir/Grimwood.exe";
    $envars   = " -dedicated -mission \"core/levels/Empty Terrain.mis\"";

    $runPath = $runExe . $envars;

    chdir($startDir);

    $descriptorspec = array (
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
    );

    if ( is_resource( $prog = proc_open("start /b " . $runPath, $descriptorspec, $pipes, $startDir, NULL) ) )
    {
        $ppid = proc_get_status($prog)['pid'];
    }
    else
    {
        echo("Failed to execute!");
        exit();
    }

    $output = array_filter(explode(" ", shell_exec("wmic process get parentprocessid,processid | find \"$ppid\"")));
    array_pop($output);
    $pid = end($output);

    echo("\nProcess ID: $pid ; Parent's Process ID: $ppid\n");

    // returns right process
    $task = shell_exec("tasklist /fi \"PID eq $pid\"");
    echo("\n\nProcess: \n$task\n\n");

    // returns no process found
    $task = shell_exec("tasklist /fi \"PID eq $ppid\"");
    echo("\n\nParent Process: \n$task\n\n");

?>