Php 如何通过主脚本控制其他脚本,并在它们运行时向它们传递参数

Php 如何通过主脚本控制其他脚本,并在它们运行时向它们传递参数,php,command-line,stdin,proc-open,Php,Command Line,Stdin,Proc Open,我有一个main.php和test.php test.php应该由main.php执行 两个脚本都必须无限运行 main.php必须在test.php运行与否的时间段内进行检查,如果它没有运行(如果出现错误),则再次执行该检查 我也必须有错误日志 如果main.php收到'test stop'它会将'close'发送到test.php和test.php必须停止(我不知道在执行之后如何将我的命令(例如'test stop')发送到main.php) 我有这些样品: main.php: &

我有一个main.phptest.php

  • test.php应该由main.php执行
  • 两个脚本都必须无限运行
  • main.php必须在test.php运行与否的时间段内进行检查,如果它没有运行(如果出现错误),则再次执行该检查
  • 我也必须有错误日志
  • 如果main.php收到
    'test stop'
    它会将
    'close'
    发送到test.phptest.php必须停止(我不知道在执行之后如何将我的命令(例如
    'test stop'
    )发送到main.php
  • 我有这些样品:

    main.php

         <?php
    
    function execute(){
        $desc = array(
            0 => array('pipe', 'r'), 
            1 => array('pipe', 'w'),
            2 => array('file', 'log.txt', 'a') 
        );
        $cmd = "start /b C:\wamp\bin\php\php5.4.3\php.exe test.php";
        $p = proc_open($cmd, $desc, $pipes);
        $res[0] = $p;
        $res[1] = $pipes;
        return $res;
    }
    $res = execute();
    
    while(1) {
    
        $status = proc_get_status($res[0]);
        if (!$status['running']) {
            $res = execute();
        }
    
        if ( trim(fgets(STDIN)) == 'stop test' ) {
          fwrite($res[1][0], 'close');
    
          fclose($res[1][0]);
          fclose($res[1][1]);
          fclose($res[1][2]);
          proc_close($res[0]);
          break;
        }
    
    }
    ?>
    
    <?php
    
    while (1) {
    
         // ---------
         // other commands
         // ---------
         // ---------
    
    
    $status = trim(fgets(STDIN));
    
    if ($status == 'close') exit();
    
    }
    ?>
    
    
    
    test.php

         <?php
    
    function execute(){
        $desc = array(
            0 => array('pipe', 'r'), 
            1 => array('pipe', 'w'),
            2 => array('file', 'log.txt', 'a') 
        );
        $cmd = "start /b C:\wamp\bin\php\php5.4.3\php.exe test.php";
        $p = proc_open($cmd, $desc, $pipes);
        $res[0] = $p;
        $res[1] = $pipes;
        return $res;
    }
    $res = execute();
    
    while(1) {
    
        $status = proc_get_status($res[0]);
        if (!$status['running']) {
            $res = execute();
        }
    
        if ( trim(fgets(STDIN)) == 'stop test' ) {
          fwrite($res[1][0], 'close');
    
          fclose($res[1][0]);
          fclose($res[1][1]);
          fclose($res[1][2]);
          proc_close($res[0]);
          break;
        }
    
    }
    ?>
    
    <?php
    
    while (1) {
    
         // ---------
         // other commands
         // ---------
         // ---------
    
    
    $status = trim(fgets(STDIN));
    
    if ($status == 'close') exit();
    
    }
    ?>
    
    
    
    好的,这是我代码的摘要,但它们不正确

    例如,当脚本到达此行时,
    $status=trim(fgets(STDIN))test.php中,它等待输入,如果我们不发送任何输入,脚本将停止并不运行其余的代码,但我希望脚本在循环中运行并执行命令,直到main.php将输入传递给他


    我在windows上工作。

    我想说,PHP并不是实现您想要实现的目标的最佳工具。为什么不用C或Visual Basic之类的语言编写程序呢

    但它也可以在PHP中解决: 我建议您创建自己的错误处理函数,并通过set\u error\u处理程序('my\u custom\u error\u function')函数在test.php中分配它

    在my_custom_error_function()中,可以记录错误并重新启动test.php 可以通过文件内容('.\error.log',$error\u string,file\u APPEND)将行追加到日志文件中。


    fgets()需要一个打开的文件句柄。因此,您可能需要检查例程(或提供更多代码)。您可能还想查看文件内容()。

    为什么没有人回答我,哪怕是一个简单的答案??:((如果你的解决方案是针对linux的,那没问题。在这里说。也许我可以用windows语法转换它。请帮助我:))明天我将启动一个
    bounty