董俊俊 的个人动态
  • 董俊俊 提出了问题
    4个月前
  • 董俊俊 回答了问题
    4个月前

    循环引用的python程序中,如何释放掉内存。

    这种递归方式,内存没占满也是会栈溢出的。递归过程中,上一层的函数实际并没有运行完,因此也别指望垃圾回收过来清理。强烈建议改程序,可以类似这样:

    while True:
        a()
        b()
  • 董俊俊 回答了问题
    4个月前

    php://input在表单POST是否无效?

    php://input 可以接受所有 body 内容。
    但是遗憾的是:
    enctype="multipart/form-data" 时 php://input 无效

    参见官方文档

    php://input is not available with enctype="multipart/form-data".

    大意:enctype="multipart/form-data" 的时候 php://input 是无效的。

    哎。我以前也写php,但后来发现他是一个难接触到更深层次东西的语言。这不符合我的性格,所以我放弃了。php在io方面的能力。真的是。。。哎。

    还是老老实实地用 file_upload 之类的函数吧。虽然很低效,但是又能怎么样呢?

    祝你好运。

  • 董俊俊 提出了问题
    4个月前
  • 董俊俊 回答了问题
    4个月前

    Nginx内部有使用多线程吗?

    cat /proc/3776/status|grep Threads 可见Nginx工作进程只有1个线程,其中3776是Nginx工作进程的PID。另外Nginx从1.7.11加入了AIO线程池支持,能够使用AIO多线程读取和发送大文件,以免工人进程被阻塞(小文件用sendfile,大文件用AIO线程池),要启用线程池支持,configure时需要显式加入--with-threads选项。
    https://www.nginx.com/blog/thread-pools-boost-performance-9x/
    http://nginx.org/en/docs/ngx_core_module.html#thread_pool

    转:
    当listen_fd有新的accept()请求过来,操作系统会唤醒所有子进程,因为这些进程都epoll_wait()同一个listen_fd,操作系统又无从判断由谁来负责accept,索性干脆全部叫醒,但最终只会有一个进程成功accept,其他进程accept失败.所有子进程都是被"吓醒"的,所以称之为Thundering Herd(惊群).

    监听套接字在启动时就完成初始化,worker进程通过这些套接字接受,读取请求和输出响应.Nginx并没有像PHP-FPM那样采用master进程来分发请求,这个工作由操作系统内核机制完成,所以可能会导致惊群现象,也就是当listen_fd有新的accept()请求过来,操作系统会唤醒所有子进程.

    Nginx解决惊群的思路:避免惊群.
    http://nginx.org/en/docs/ngx_core_module.html#accept_mutex
    具体措施有使用全局互斥锁(accept_mutex on),每个工作进程在epoll_wait()之前先去申请锁,申请到则继续处理,获取不到则等待,并设置了一个负载均衡的算法(当某一个工作进程的任务量达到总设置量的7/8时,则不会再尝试去申请锁)来均衡各个进程的任务量.

    Nginx解决惊群的新方法:使用内核提供的Socket ReusePort功能
    NGINX 1.9.1 支持socket分片:
    http://nglua.com/docs/sharding.html
    NGINX1.9.1支持socket的SO_REUSEPORT选项,这个选项在许多操作系统的新版本有效,包括DragonFly BSD和Linux(3.9+内核).这个选项允许多个socket监听同一个IP地址和端口的组合.内核负载均衡这些进来的sockets连接,将这些socket有效的分片.当SO_REUSEPORT选项没开启时,连接进来时监听socket默认会通知某个进程.如果accept_mutex off这个指令,此时会唤醒所有的工作进程,它们将为了得到它产生竞争,这就是所谓的惊群现象.如果使用epoll且不用锁(accept_mutex off),当监听端口有读操作时,是会产生惊群现象的.启用SO_REUSEPORT选项后,每个进程都有自己独立的监听socket.内核决定哪个是有效的socket(进程)得到这个连接.这样做降低了延迟并提高了工作进程的性能,它也意味着工作进程在准备处理它们前被赋予了新的连接.

    nginx默认以多进程的方式工作,一个master进程和多个worker进程,master进程主要用来管理worker进程.多个worker进程同等竞争来自客户端的请求,一个worker进程可以处理多个请求,但不能处理其它worker进程的请求.每个worker进程里面只有一个主线程,在epoll支持下,采用异步非阻塞的方式来处理请求,从而实现高并发.epoll支持监听多个事件(socket轮询),当事件没准备好时,放到epoll里面,事件准备好了,就去读写.与多线程相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级.并发数再多也不会导致无谓的资源浪费(上下文切换),更多的并发数,只是会占用更多的内存而已.而httpd常用的工作方式是每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了,这对操作系统来说,是个不小的挑战.线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,httpd的性能自然就上不去了.Tengine团队之前有对连接数进行过测试,在24G内存的机器上,Nginx处理的并发请求数达到过200万.(平均1G内存可以处理8万多请求)Nginx支持将某一个进程绑定在某一个核上(CPU亲缘性绑定),这样就不会因为进程的切换带来cache的失效,所以推荐设置cpu有几个核就设置几个worker进程.但注意,过多的worker进程,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换,所以worker进程不是越多越好.详细参见:
    http://tengine.taobao.org/book/chapter_02.html

  • 董俊俊 回答了问题
    4个月前

    phper整天CURD,Laravel如何支撑高并发???

    千万不要这样认为。要搞清楚为什么要用框架?框架可不是随便出现的,它是解决问题的。
    下面的概念请认真理解清楚。

    • “设计模式 < 框架 < 架构 < 平台”: 从复用角度讲,设计模式是代码级复用、框架是模块级复用、架构是系统级复用、平台是企业应用级复用。
    • 模式:即 pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。大型程序使用
    • 框架:即 framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
    • 架构:从大的层面来说,比如针对公司业务的 B2C 网站系统架构,里面可能会用到多种解决各方面问题的框架,关注的是技术整合、扩展、可维护性。换个角度,在框架中也会涉及到架构问题,比如开发 NHibernate 框架,也需要考虑如何进行设计。
    • 平台:平台的概念类似框架,但又结合的架构的考虑,它是更高层面上的 “框架”,准确说是一种应用。它是针对企业用户,为解决企业业务需要而形成的产品。

    怎么更具体的理解呢?

    • 类库是工具箱
    • 框架 —— 一套通用解决方案 —— 是书柜架子,可以装门,抽屉通用解决方案,针对不同场景使用。不好跨越(书架不可以睡人),更换框架就像换书架一样,迁移原有物品
    • 架构 —— 高度抽象需求 ———— 就是房子的房型图,房间怎么用怎么装修,但是承重墙不能动,80 平不会多,人多就住不下
    • 平台 —— 所有可能事情集合 ———— 相当于小区,有所限制,有所提供服务

    实用来说,平台没啥好选,没多少可选。架构考验人,设计不好就被虐,框架看团队偏好,一般选择熟悉的。库自己选顺手的即可

    “laravel 注重的优雅的写代码,相对 java 之类的性能太弱了” ---- 你应该佩服 laravel 作者,为什么设计这么好用的框架。设计出一个这么好的舞台,表演如何,就看你演技是否高超了。

  • 董俊俊 回答了问题
    4个月前

    mysql是否该使用外键约束???

    是否使用外键确实会有一些争议。

    关于外键的使用:

    首页,外键本身是为了实现强一致性,所以如果需要正确性 > 性能的话,还是建议使用外键,
    它可以让我们在数据库的层面保证数据的完整性和一致性。

    当然不用外键,你也可以在业务层进行实现。
    不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。
    也就是说业务逻辑和数据必须同时修改。
    而且在工作中,业务逻辑是会经常发生变化的。

     

  • 董俊俊 提出了问题
    4个月前
  • 董俊俊 发布了文章
    4个月前

    程序员如何用8小时之外赚钱?

    程序员8小时以外的挣钱路子&hellip;&hellip;&nbsp;在这个和谐的社会也需要钱;还要找女朋友、房子、车&hellip;等等&nbsp;,然后想想自己的月薪,慢慢赞吧&hellip;&h
  • 董俊俊 发布了文章
    4个月前

    程序员为什么不单干、接私活、自己开公司

    此篇文章来源于知友的提问「为什么程序员不单干,自己写程序卖啊啥的&hellip;&hellip;而要去公司上班领死工资?」这对于在校的和刚工作不久的程序员来说是一个非常好的问题,甚至我相信不少人自己也
  • 董俊俊 发布了文章
    4个月前

    卧槽,写代码真赚钱

    每个人大学的时候都曾有个梦想:脱离父母的管束,获得自由。然而每个月还是要从他们那里拿生活费。所以在大学时代时代实现经济自由就成了实现梦想的必经之路。你看,我就是那众多的人之一。然而我并不是因为想获得自
  • 董俊俊 发布了文章
    4个月前

    python中不按顺序传递默认参数与php的不同

    今天看到python的函数部分,发现python的函数有一个很实用的特性:支持函数调用方不按顺序提供部分默认参数。一般的带可选参数的函数和调用如下:def power(x, n=2): if n
  • 董俊俊 回答了问题
    4个月前

    php 在不知道变量参数的情况下,实现调用想要顺序

    不知道参数,这个其实可以用反射类relation来搞定

    // 其中Test为类名
    $ref = new ReflectionClass('Test');
    // A为类下面的方法名
    $method = $ref->getMethod('A');
    // 开始传递参数,其中vars为传递的参数集合.
    $result = $method->invokeArgs(new Test(),$vars)

    这个就是反射.详细请查阅文档Reflection
    当然这个是类的调用,如果是单纯的方法,请使用ReflectionFunction,
    请根据具体的实例来new具体的reflection

  • 董俊俊 发布了文章
    4个月前

    使用 Laravel 开发 SPA 时, Routing 的正确姿势

    缘起通常开发一个 SPA 的起手式是新建两个工作目录:一个 client 目录用于存放前端源代码,一个 laravel 目录用于开发 webservices 功能以及后台面板。前后端分离,互不干扰。例
  • 董俊俊 回答了问题
    4个月前

    Promise.resolve有什么用处?

    当你的数据不是promise实例,或者你不知道他是不是promise,而你又想把他当做promise实例来使用的时候

    比如如果本地有数据data返回data,没有则请求

    Promise.resolve(data ? data : getData()).then(...)
  • 董俊俊 回答了问题
    4个月前

    typescript中boolean类型的自动转换问题

    默认值

    默认值可以让你在属性为 undefined 时使用缺省值:

    function keepWholeObject(wholeObject: {a: string, b?: number}) {

    let {a, b = 1001} = wholeObject;

    }
    现在,即使 b 为 undefined , keepWholeObject 函数的变量 wholeObject 的属性 a 和 b 都会有值

  • 董俊俊 回答了问题
    4个月前

    执行composer require 一会儿就提示“已杀死”

    一般是内存不足导致进程被杀死。

    没办法增大物理内存的话可以考虑扩容 swap 分区。

    参考这篇:https://www.jianshu.com/p/fac...

  • 董俊俊 回答了问题
    4个月前
最近访客
  • 小花花
    小花花 3个月前