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()代码>不仅仅是可能;这不是一个配置错误的问题。。。所谓禁用,我的意思是,即使您尝试加载它,它也不会自动注册。至于名称空间,错误消息将在当前名称空间中显示它,因为这是它第一次尝试解决的问题,但在幕后它也会尝试在根名称空间中找到它;它不需要显式地声明为存在(尽管这不会造成伤害)。