PHP内置服务器无法使用cURL功能

7

我有一个相对简单的脚本,如下所示:

<?php
$url = "localhost:2222/test.html";

echo "*** URL ***\n";
echo $url . "\n";
echo "***********\n";
echo "** whoami *\n";
echo exec('whoami');
echo "* Output **\n";

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$output = curl_exec($ch); 

curl_close($ch);

echo $output;

当我在命令行上执行此脚本时,它可以工作 - 我可以从test.html中得到一点结果。

但是,当我通过内置的PHP服务器加载并运行此脚本时,它会卡住。没有输出到屏幕,没有写入日志。

我读到有时用户权限可能会妨碍程序运行,所以我尝试使用whoami命令确保运行内置PHP服务器的用户与在命令行上执行脚本的用户相同,结果也相同。

safe_mode已关闭,disable_functions未设置任何内容。我可以成功地执行其他命令(例如whoami)。

还应该检查什么?内置的PHP服务器在执行请求时是否算作其他用户?


可能是在URL中指定端口的问题。我以前遇到过这个问题。我通过从URL中删除端口来解决它,不确定这对你是否有效。 - Dan
2
localhost:2222 是运行此脚本的同一台服务器吗?我对内置的 PHP 开发服务器不是很熟悉,但如果该服务器是单线程的,则可能会遇到死锁情况。 - deceze
@dan08 我无法在curl URL中找到资源而不带端口号。似乎无法在没有端口号的情况下启动服务器。 - Deltran
你需要使用 curl_setopt ($ch, CURLOPT_PORT , 2222); 来指定端口,而不是在url中指定。 - DarkBee
@deceze 显然内置的PHP开发服务器是单线程的 - 我启动了第二个运行在3333端口上的服务器,它能够使用curl获取文件!谢谢! - Deltran
@DarkBee curlopt_port是一个不错的选择,但即使更改它也无法让请求完成。 - Deltran
3个回答

29

PHP内置的开发Web服务器是一个非常简单的单线程测试服务器。它无法同时处理两个请求。您正在尝试在单独的请求中从自身检索文件,因此遇到死锁。第一个请求正在等待第二个请求完成,但在第一个请求仍在运行时无法处理第二个请求。


1
干得好。我自己也遇到了同样的问题,简直要疯了。 - Manngo
8
我想在这个答案中添加一个奖励。如果你想继续使用PHP内置的服务器,你可以在不同的端口上创建一个新的服务器 php -S 127.0.0.1:2223,并向新服务器的URL发出curl请求。 - muratgozel
遇到了这个问题,最终得出的解决方案与@muratgozel有些相似。如果我一开始就找到了这篇文章,我本可以节省两天时间。当像这样的问题在没有记录或抛出错误的情况下默默地失败时,这真是令人发狂。 - WiiBopp

2
自 PHP 7.4 起,环境变量 PHP_CLI_SERVER_WORKERS 允许在内置 Web 服务器上通过生成多个 PHP 工作进程来处理并发请求。该功能被视为实验性功能,请参见文档
使用此功能,PHP 脚本可以向自身发送请求,而无需停止服务。
PHP_CLI_SERVER_WORKERS=10 php -S ...

同样适用于Laravel:

PHP_CLI_SERVER_WORKERS=10 php artisan serve

-7

2
请查看 [answer]。 - DarkBee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接