代码之家  ›  专栏  ›  技术社区  ›  biera

PHP:pntl_exec即使提供了有效的可执行路径也无法工作

  •  1
  • biera  · 技术社区  · 2 月前

    我的测试套件设置需要启动本地web服务器。

    到目前为止,我已经想到了这个:我使用了一个PHP内置的web服务器,一个启动web服务器、运行测试并最终终止它启动的web服务器的PHP脚本。

    <?php
    
    $childPid = pcntl_fork();
    
    if ($childPid == -1) {
        die('Fork failed');
    } else if ($childPid == 0) {;
        // start webserver
        pcntl_exec('/usr/local/bin/php -S localhost:1234');
    } else {
        // TODO: check if the webserver is ready 
        
        // run tests
        passthru(__DIR__.'/vendor/bin/phpunit tests');
        
        // terminate webserver
        exec("kill -15 $childPid");
    }
    

    上述脚本位于 /app/test.php 当我这样运行它时

    php test.php
    

    我遇到了这个错误:

    PHP Warning: pcntl_exec(): Error has occurred: (errno 2) No such file or directory in /app/test.php on line 9

    作为参考,这是官方文件对 $path 参数(的第一个参数 pcntl_exec ):

    path必须是二进制可执行文件或具有有效的脚本的路径 指向shebang中可执行文件的路径(#!/usr/local/bin/perl 例如)作为第一行。请参阅系统的执行人员(2)页面 获取更多信息。

    我很确定这条路( /usr/local/bin/php )我提供的是正确的,它不是符号链接。

    什么时候?

    /usr/local/bin/php -S localhost:1234
    

    如果从命令行调用,则Web服务器将成功启动。

    1 回复  |  直到 2 月前
        1
  •  2
  •   hakre    2 月前

    你描述

    $path参数(pcntl_exec的第一个参数)

    你写道,你非常确定以下是一个可执行路径:

    /usr/local/bin/php -S localhost:1234
    

    当错误消息诊断时,这最终是 案件。

    (errno 2)没有这样的文件或目录

    事实上,根据常见的php(1)调用,可执行路径是:

    /usr/local/bin/php
    

    因此,从$path参数中删除参数,它们不属于那里,并将它们放在适当的$args参数上。

    pcntl_exec('/usr/local/bin/php', ['-S', 'localhost:1234']);
    

    奖金:

    要在shell中测试(错误的)路径“/usr/local/bin/php-S localhost:1234”是否是可执行路径,请使用内置的命令special:

    $ command -v /usr/local/bin/php -S localhost:1234
    $ echo $?
    1
    

    (非零退出状态代码(1),即故障)

    对于快乐路径,它显示命令的路径名,并成功退出:

    $ command -v /usr/bin/php      
    /usr/bin/php
    $ echo $?
    0
    

    (退出状态代码为零(0),即成功)