我一直在浏览PHP's source code and the mysql_pconnect function并注意到它使用zend_globals中定义的某种HashTable persistent_list
。
问题是,当PHP设置为mod apache / fcgi时,如何在请求之间保留这些全局变量和变量。如果它是针对每个请求产生的新PHP进程,则不应保留这些变量。
答案 0 :(得分:1)
PHP-FPM重用上下文,允许持久连接在FCGI中工作。虽然PHP-FPM最初会创建多个进程,但最终会产生多个连接,每个进程或上下文都有一个连接。
需要考虑的是,“持久连接弊大于利”是一句话在#php.pecl中说了很多。连接的开销很轻,PHP适合这种处理。在设计为不断运行的语言中,连接的开销可能更大(通常因为,简单地连接影响的对象比prorgram直接操作的对象多得多),因此持久性或池化连接是有意义的。 PHP被设计为尽可能快地完成所有事情,以及它使用了多少资源来完成它 - 一切都必须在大约250ms内运行 - 连接到mysql并不会在整个框架中触发一堆钩子,就像在其他框架中一样。语言,所以开销很小。此外,如果接收计算机没有配置mysql实例(使用荒谬的设置),则每个进程的持久连接不会像其他语言中那样构成托管连接池,然后连接将变为陈旧且在* _pconnect上PHP必须首先在创建新连接之前使旧连接无效,这比仅创建新连接的效率低且速度慢。
答案 1 :(得分:-1)
问题是,当PHP设置为mod apache / fcgi时,如何在请求中保留这些全局变量和变量。
作为apache模块,它们是共享的,因为apache httpd本身仍在运行。这个运行过程产生了PHP,并将在未来产生其他PHP。由于子线程可以与其父线程相关,因此它可以存储在父节点内存空间中。
作为FCGI,只要二进制文件已经运行,这在技术上是可行的,但是FPM尚未实现。我也想说,对于FCGI来说,它也没有任何意义,因为它是每个脚本并且还涉及超时,因此整个网络服务器的寿命要短得多。