有一个最致命的问题,PHP官方文档说的很明确
The web server runs only one single-threaded process, so PHP applications will stall if a request is blocked.
翻译一下就是,内置的web服务器只运行了一个单线程,如果请求阻塞,PHP应用就挂掉了
举例说明,新建一个 index.php 文件
echo "开始时间:".time()."\r\n";
$type=$_GET["type"]??0;
if($type==1){
sleep(10);
}else{
echo "hello world\r\n";
}
echo "结束时间".time()."\r\n"
然后在当前目录执行 php -S 127.0.0.1:1333
,启动内置的服务器,模拟并发请求,依次访问
- 127.0.0.1:1333?type=1
- 127.0.0.1:1333
就会发现第二个请求需要等待内置的服务器处理完第一个请求之后,才能处理,这在生产环境是难以想象的= =
PHP 自身内置的 HTTP 服务并不能满足生产环境要求,用在调试开发还凑合。
- 能力上,内置 HTTP 支持 仅有 HTTP 协议基础支持,不具备负载均衡等能力,支持起 HTTPS 等还要再自己进一步包装处理,技术门槛比较高。
- 性能上,比
Nginx
/Apache
等 Web 服务器性能好。 - 另外,PHP 内置 HTTP 服务和 php-fpm 提供的能力不是一回事,此处的对比仅针对
php -S
展开讨论。
如果想用 PHP 提供 HTTP Web 服务,可以看看类似 Swoole 一类的实现。当然,这块我理解已经超出你想讨论的范畴了。
这个面试官说的一些话还是有道理,他说他每天看的很多简历,大家的写的都差不多,你会熟练使用框架,懂框架源码,很多人很懂,你会mysql优化,redis分布式,集群,很多人都会,curd更不用说了,如何怎么体现你的优势?你对php这门语言理解的到底有多深;另外他还问了垃圾回收,我说引用计数,底层的结构体有表示引用次数的字段,当值为0的时候这块内存就会被释放,删除占用这块内存的变量就会+1,有变量使用引用变量就会+1,他说这个答案太简单,大家都知道,具体什么时候+1,什么时候-1?我也不知道说什么了,就说了一下COW机制,还是没用get到他想要的;也怪我简历上写了熟知php底层,他是冲着这个亮点问的 :sob:。整个面试跟php相关的基础都没有问,其实我自己也觉得php没什么好问的了。
有一个最致命的问题,PHP官方文档说的很明确
The web server runs only one single-threaded process, so PHP applications will stall if a request is blocked.
翻译一下就是,内置的web服务器只运行了一个单线程,如果请求阻塞,PHP应用就挂掉了
举例说明,新建一个 index.php 文件
echo "开始时间:".time()."\r\n";
$type=$_GET["type"]??0;
if($type==1){
sleep(10);
}else{
echo "hello world\r\n";
}
echo "结束时间".time()."\r\n"
然后在当前目录执行 php -S 127.0.0.1:1333
,启动内置的服务器,模拟并发请求,依次访问
- 127.0.0.1:1333?type=1
- 127.0.0.1:1333
就会发现第二个请求需要等待内置的服务器处理完第一个请求之后,才能处理,这在生产环境是难以想象的= =
推荐文章: