zoukankan      html  css  js  c++  java
  • 解决内存溢出问题

    1.通过php.ini进行设置

      eg:ini_set('memory_limit,'128M');  //如果safe_mode开启的话是没有用的

    2.如果代码块中出现了大量的循环语句,使用过后的没有用的数据,应当及时unset掉

      eg:

      foreach ($ask_lists as $k_1 => $list)
      {
        $ask_img_set = array();
        foreach ($student_info as $k_2 => $info)
        {
          if($list->student_id == $info->student_id)
          {
            $ask_lists[$k_1] -> student_name = $info->student_name;
            $ask_lists[$k_1] -> student_nickname = $info->student_nickname;
          }
          unset($student_info[$k_2]);
        }
       //将提问的图片放置数组
        if(strlen($list->ask_img_1)>0): array_push($ask_img_set,$list->ask_img_1);
        if(strlen($list->ask_img_2)>0): array_push($ask_img_set,$list->ask_img_2);
        unset($ask_lists[$k_1]->ask_img_1);
        unset($ask_lists[$k_1]->ask_img_2);
      }

    3.大文件进行分片读写

      eg:

      public function testFilePutContent(Request $request)
      {
        header("content-type:text/html;charset=utf-8");
        $mp3_url = 'http://oflmvdj34.bkt.clouddn.com/20180325_9x2wesr2.mp3';
        $src_data = fopen("$mp3_url","r");
        $des_data = fopen("test.mp3","w");
        while($str = fread($src_data,4096)){
          fwrite($des_data,$str);
        }
        fclose($des_data);
        fclose($src_data);
        echo "写入完毕";
      }

    3.__destruct

    __destruct() 析构函数,是在垃圾对象被回收时执行。

    4.Session 与PHP垃圾回收机制

    由于PHP的工作机制,它并没有一个daemon线程来定期的扫描Session信息并判断其是否失效,当一个有效的请求发生时,PHP 会根据全局变量 session.gc_probability和session.gc_divisor的值,来决定是否启用一个GC, 在默认情况下,session.gc_probability=1, session.gc_divisor =100也就是说有1%的可能性启动GC(也就是说100个请求中只有一个gc会伴随100个中的某个请求而启动).

    PHP垃圾回收机制的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟),就将该session删除。 
    但是,如果你Web服务器有多个站点,多个站点时,GC处理session可能会出现意想不到的结果,原因就是:GC在工作时,并不会区分不同站点的session.

    那么这个时候怎么解决呢?

      1). 修改session.save_path,或使用session_save_path()让每个站点的session保存到一个专用目录, 
      2). 提供GC的启动率,自然,PHP垃圾回收机制的启动率提高,系统的性能也会相应减低,不推荐。 
      3). 在代码中判断当前session的生存时间,利用session_destroy()删除.

  • 相关阅读:
    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示
    ABP .Net Core 日志组件集成使用NLog
    ABP .Net Core Entity Framework迁移使用MySql数据库
    ABP前端使用阿里云angular2 UI框架NG-ZORRO分享
    阿里云 Angular 2 UI框架 NG-ZORRO介绍
    Visual Studio 2019 Window Form 本地打包发布猫腻
    VS Code + NWJS(Node-Webkit)0.14.7 + SQLite3 + Angular6 构建跨平台桌面应用
    ABP .Net Core 调用异步方法抛异常A second operation started on this context before a previous asynchronous operation completed
    ABP .Net Core To Json序列化配置
    .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”
  • 原文地址:https://www.cnblogs.com/soaring-sun/p/8675011.html
Copyright © 2011-2022 走看看