在php扩展中是用了一个单例模式的全局对象,当http服务停止时通过日志查看并且打印进程号,发现析构函数被多次调用,并且是在不同的进程里(通过进程号观察)。 为什么会这样! 不是说http服务启动一次 ,我那全局对象就实例化一次吗! 服务停止时怎么会发生这么多怪异的现象!

解决方案 »

  1.   

    是谁在响应 HTTP 请求?apache、IIS ...
    PHP 在 HTTP 请求中的地位?web 服务器的应用程序所以对于每一个与 PHP 相关的 HTTP 请求,都会触发一个 PHP 进(线)程
    你的扩展是以动态链接库存在的,在进(线)程中是独立的如果你想使你扩展的类被各进(线)程共享,就必须修改php的内核,不过无论是在什么系统中,这个内核都不是开源的,都是以库方式提供的
      

  2.   

    你php是cgi跑的吧,那的确会不停的构造与析构,因为都是每次都是新的Php解释器进程加载一堆动态库,其中包括你那个静态的C++对象,每个PHP进程加载同一份动态库,但它们内存是隔离的。楼主用fcgi跑php的话就不一样了,只有在并发请求数超过当前的fcgi进程数情况下才会创建新的fcgi进程,不过也肯定不是多进程共享的。
      

  3.   

    是在apache里启动的。如果向你说的那样的话,那我的php扩展里就不能使用全局对象了!晕!
      

  4.   


    你说的cgi和fcgi我不懂,谷歌了一下大概知道什么意思了。反正是apache里对我的全局对象在多个进程里实例化一次了。 也就是说我的扩展力不能有全局对象了!郁闷!
      

  5.   

    你可以参考一下手册中: "counter" 扩展 - 一个连续的实例 一节和他实现的代码