Php 为什么在Laravel控制器中未定义pcntl_fork()?

Php 为什么在Laravel控制器中未定义pcntl_fork()?,php,laravel,pcntl,Php,Laravel,Pcntl,我有一个控制器: class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct(){} public function index() { pcntl_fork(); } } 然后我通过HTTP请求调用

我有一个控制器:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct(){}

    public function index()
    {
        pcntl_fork();
    }
}
然后我通过HTTP请求调用
index()
,得到:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
Call to undefined function App\Http\Controllers\pcntl_fork()
然后我试试这个:

class CodeSheet extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'code_sheet';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        pcntl_fork();
        echo "1\n";
    }
}
然后我调用这个命令:

vagrant@homestead:~$ php artisan code_sheet
1
1

所以我的问题是,为什么我可以在命令中调用
pcntl\u fork()
,但不能在HTTP请求中调用?

在web环境中禁用了pcntl扩展(它甚至可能只为CLI SAPI编译),这与Laravel无关

原因很简单——web服务器本身(或PHP-FPM)控制着流程管理,因此使用此扩展将与之产生冲突


它在Windows下也不可用,因为它是UNIX特有的东西。

您是对的,PCNTL可能在环境中被禁用。但是,正如OP所说,该函数是从错误的名称空间解析的。如果它存在于OP的环境中,OP必须从全局名称空间引用它,例如
\pcntl_fork()不仅仅是可能;这不是一个配置错误的问题。。。所谓禁用,我的意思是,即使您尝试加载它,它也不会自动注册。至于名称空间,错误消息将在当前名称空间中显示它,因为这是它第一次尝试解决的问题,但在幕后它也会尝试在根名称空间中找到它;它不需要显式地声明为存在(尽管这不会造成伤害)。