php扩展中c++单例模式的全局对象实例被生成多个子进程销毁,为啥?该如何解决
程序员文章站
2024-01-29 12:15:46
...
php扩展中c++单例模式的全局对象实例被生成多个子进程销毁,为啥??
在php扩展中是用了一个单例模式的全局对象,当http服务停止时通过日志查看并且打印进程号,发现析构函数被多次调用,并且是在不同的进程里(通过进程号观察)。 为什么会这样! 不是说http服务启动一次 ,我那全局对象就实例化一次吗! 服务停止时怎么会发生这么多怪异的现象!
------解决方案--------------------
请问你如何知道析构函数被多次调用?另外是不是你在程序里有被实例化多次?
------解决方案--------------------
是谁在响应 HTTP 请求?apache、IIS ...
PHP 在 HTTP 请求中的地位?web 服务器的应用程序
所以对于每一个与 PHP 相关的 HTTP 请求,都会触发一个 PHP 进(线)程
你的扩展是以动态链接库存在的,在进(线)程中是独立的
如果你想使你扩展的类被各进(线)程共享,就必须修改php的内核,不过无论是在什么系统中,这个内核都不是开源的,都是以库方式提供的
------解决方案--------------------
你php是cgi跑的吧,那的确会不停的构造与析构,因为都是每次都是新的Php解释器进程加载一堆动态库,其中包括你那个静态的C++对象,每个PHP进程加载同一份动态库,但它们内存是隔离的。
楼主用fcgi跑php的话就不一样了,只有在并发请求数超过当前的fcgi进程数情况下才会创建新的fcgi进程,不过也肯定不是多进程共享的。
------解决方案--------------------
在php扩展中是用了一个单例模式的全局对象,当http服务停止时通过日志查看并且打印进程号,发现析构函数被多次调用,并且是在不同的进程里(通过进程号观察)。 为什么会这样! 不是说http服务启动一次 ,我那全局对象就实例化一次吗! 服务停止时怎么会发生这么多怪异的现象!
------解决方案--------------------
请问你如何知道析构函数被多次调用?另外是不是你在程序里有被实例化多次?
------解决方案--------------------
是谁在响应 HTTP 请求?apache、IIS ...
PHP 在 HTTP 请求中的地位?web 服务器的应用程序
所以对于每一个与 PHP 相关的 HTTP 请求,都会触发一个 PHP 进(线)程
你的扩展是以动态链接库存在的,在进(线)程中是独立的
如果你想使你扩展的类被各进(线)程共享,就必须修改php的内核,不过无论是在什么系统中,这个内核都不是开源的,都是以库方式提供的
------解决方案--------------------
你php是cgi跑的吧,那的确会不停的构造与析构,因为都是每次都是新的Php解释器进程加载一堆动态库,其中包括你那个静态的C++对象,每个PHP进程加载同一份动态库,但它们内存是隔离的。
楼主用fcgi跑php的话就不一样了,只有在并发请求数超过当前的fcgi进程数情况下才会创建新的fcgi进程,不过也肯定不是多进程共享的。
------解决方案--------------------
相关文章
相关视频