使用单例模式解决PHP耗尽服务器内存的问题

今天公司的项目出现了php超过了服务器内存限制的错误:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1792 bytes) in *****
后来发现Alert_Push_Main类中的main()是一个死循环观察者,一直在调用atom(),而atom()中的观察者类Alert_Push_Observer将一直被new即分配内存,我使用memory_get_usage()看了下内存的使用情况,每运行一次atom()会消耗1088bytes的内存,而这个main()是一个死循环,进程一直没有停止,导致这些内存没有释放掉,最终铸成了服务器内存耗尽的问题。
<?php
class Dzl_Alert_Push_Main
{
     public static function main()
     {
          while (true) {
               $weekday = date('w', strtotime(date('Y-m-d')));
               if (date('H:i:s') <= '15:00:00' 
               && date('H:i:s') >= '09:25:00'
               && $weekday != 0 && $weekday != 6) {
                    self::atom();
               } else {
                    //用于停掉观察者的死循环
                    break;
               }
          }
     }

     public static function atom()
     {
          $one = new Dzl_Alert_Push_Subject_Main();
          //下面这句是罪魁祸首!!!
          $observer = new Dzl_Alert_Push_Observer($one);
          $one->dealTrigger();
     }
}
解决方法:
这个时候我想到了单例模式,进程中只要一个Alert_Push_Observer对象就可以了:
<?php
class Dzl_Alert_Push_Main
{
     public static function main()
     {
          while (true) {
               $weekday = date('w', strtotime(date('Y-m-d')));
               if (date('H:i:s') <= '15:00:00' 
               && date('H:i:s') >= '09:25:00'
               && $weekday != 0 && $weekday != 6) {
                    self::atom();
               } else {
                    //用于停掉观察者的死循环
                    break;
               }
          }
     }

     public static function atom()
     {
          $one = new Dzl_Alert_Push_Subject_Main();
          //将下面这句改成了单例模式
          $observer = Dzl_Alert_Push_Observer::getInstance()->setSubject($one);
          $one->dealTrigger();
     }
}

Zend Framework 2.0在Windows上的安装配置

所有人都知道IT行业里技术更新速度非常快,Zend Framework 1还用得意犹未尽,Zend Framework 2又发布了。尽管如此,我们还是要学习Zend Framework 2,并开始使用它。今天讲讲Zend Framework 2在windows的上的安装,安装步骤如下:

1. 到https://github.com/zendframework/ZendSkeletonApplication下载zip包,解压到你服务器的根目录。

2. 打开windows的cmd,cd到刚刚解压的ZendSkeletonApplication的目录下,执行:D:\wamp\bin\php\php5.3.10\php.exe composer.phar self-update(这里的PHP可执行文件的路径修安排替换成你电脑上的路径),提示:

Updating to version ***********************************************************.
Downloading: 100%
表示更新完成。

3. 在cmd中输入D:\wamp\bin\php\php5.3.10\php.exe composer.phar install,这时候在下载Zend的类库文件等,需要耐心等待。

4. 下载完成之后,你要配置下虚拟主机了,要保证你的服务器rewrite的功能打开。以apache为例,在httpd.ini中加入:

<VirtualHost *:80>
   DocumentRoot "D:/wamp/www/Zend2/public"
   ServerName .local
   # This should be omitted in the production environment
   SetEnv APPLICATION_ENV development
   <Directory "D:/wamp/www/Zend2/public">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>

5.浏览器的地址栏中输入localhost,你就会看到以下页面,就表示Zend Framework 2安装成功了:

20130308215830

Zend Framework无法开启Apache服务器的mod_rewrite模块的解决办法

        Zend Framework的原理是把所有文件的访问都引向单一入口程序index.php,然后再由Zend_Controller_Router_Route进行路由转发,如果使用使用Apache服务器的.htaccess重写规则就必须打开Apache的服务器的mod_rewrite模块,但是很多的服务器是没有打开这个模块的,比如你买了一个空间,结果空间没有打开这个模块,那你又必须使用,怎么办呢?Zend Framework就不可以使用了吗?有的人说不可以,巧妇难为无米之炊。但是我想想觉得如果这个问题都没有解决Zend Framework怎么能在PHP界立足呢?
        后来我找到了解决的方法。方法其实很简单,就是在访问的时候加上index.php就可以了,例如:正常情况下的URL:http://www.youdomain.com/controller/action。现在我们只需把URL改成:http://www.youdomain.com/index.php/controller/action,并把.htaccess删除掉就可以了。