php自己开启http服务为什么还需要nginx/apache这种web服务器

php自己也开启http服务为什么还需要nginx/apache这种web服务器?具体原因有哪些?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

有一个最致命的问题,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

就会发现第二个请求需要等待内置的服务器处理完第一个请求之后,才能处理,这在生产环境是难以想象的= =

官方文档:www.php.net/manual/en/features.com...

1年前 评论
诺墨

PHP 自身内置的 HTTP 服务并不能满足生产环境要求,用在调试开发还凑合。

  • 能力上,内置 HTTP 支持 仅有 HTTP 协议基础支持,不具备负载均衡等能力,支持起 HTTPS 等还要再自己进一步包装处理,技术门槛比较高。
  • 性能上,比 Nginx / Apache 等 Web 服务器性能好。
  • 另外,PHP 内置 HTTP 服务和 php-fpm 提供的能力不是一回事,此处的对比仅针对 php -S 展开讨论。

如果想用 PHP 提供 HTTP Web 服务,可以看看类似 Swoole 一类的实现。当然,这块我理解已经超出你想讨论的范畴了。

1年前 评论
shaonian1996 (楼主) 1年前
诺墨 (作者) 1年前

简单来讲,php 自带的就好象自行车,nginx/apache 就好象轿车。两者都可以用,关键看需求。比如,我自己有一个玩具项目,访问量很小,我就可以用 php 自带的。

1年前 评论

这个面试官说的一些话还是有道理,他说他每天看的很多简历,大家的写的都差不多,你会熟练使用框架,懂框架源码,很多人很懂,你会mysql优化,redis分布式,集群,很多人都会,curd更不用说了,如何怎么体现你的优势?你对php这门语言理解的到底有多深;另外他还问了垃圾回收,我说引用计数,底层的结构体有表示引用次数的字段,当值为0的时候这块内存就会被释放,删除占用这块内存的变量就会+1,有变量使用引用变量就会+1,他说这个答案太简单,大家都知道,具体什么时候+1,什么时候-1?我也不知道说什么了,就说了一下COW机制,还是没用get到他想要的;也怪我简历上写了熟知php底层,他是冲着这个亮点问的 :sob:。整个面试跟php相关的基础都没有问,其实我自己也觉得php没什么好问的了。

1年前 评论
mofung 1年前
shaonian1996 (作者) (楼主) 1年前
shaonian1996 (作者) (楼主) 1年前

有一个最致命的问题,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

就会发现第二个请求需要等待内置的服务器处理完第一个请求之后,才能处理,这在生产环境是难以想象的= =

官方文档:www.php.net/manual/en/features.com...

1年前 评论

图片/css/js等静态资源难道还要用php读取内容再发送出去?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!