9月 032016
 

缘起:

一个php-fpm的请求执行时间会比较长,总是执行不完就中止了;查看php错误日志,显示执行时长超过了60s。

为什么呢?

参考php官方文档:http://php.net/manual/en/info.configuration.php#ini.max-execution-time

max_execution_time integer

This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30. When running PHP from the command line the default setting is 0.

The maximum execution time is not affected by system calls, stream operations etc. Please see the set_time_limit() function for more details.

You can not change this setting with ini_set() when running in safe mode. The only workaround is to turn off safe mode or by changing the time limit in the php.ini.

Your web server can have other timeout configurations that may also interrupt PHP execution. Apache has a Timeout directive and IIS has a CGI timeout function. Both default to 300 seconds. See your web server documentation for specific details.

说明:

  1. 命令行执行php没有执行时长限制,尽管显式在php.ini中配置、或者ini_set(“max_execution_time”, n)、或者set_time_limit(n) 都是没用的;
  2. 尽管使用ini_set(…) 、set_time_limit(..) 后,也能通过ini_get(..)发现设置的值确实发生变化了,对于命令行也是没有作用的
  3. 命令行php -i 查看到的 max_execution_time 总是0
  4. 所以: 命令行程序对于PHP执行时长限制的担心都是多余的,cli 模式下max_execution_time被硬编码为0了
  5. max_execution_time 的默认值是30s

 

关于set_time_limit:  http://php.net/manual/en/function.set-time-limit.php

  1. set_time_limit(n) 会重置时间计数器,就是说是从该函数调用的时候计数n的
  2. php-fpm的脚本中执行set_time_limit(n)、或者ini_set(“max_execution_time”, n) 是无效的
    虽然这样更加安全,但是不符合定义: http://php.net/manual/en/info.configuration.php ;这里
    有说明max_execution_time的可修改限制为PHP_INI_ALL,就是说任何条件下都可以随时修改: http://php.net/manual/en/configuration.changes.modes.php

 

结论:

  1. 命令行程序对于PHP执行时长限制的担心都是多余的
  2. php-fpm环境下,试图在脚本中修改max_execution_time是没有用的
  3. 所以,max_execution_time 一般在php.ini 中定义

 

 Posted by at 下午 4:41
8月 032016
 

php 的configure选项中启用模块时,有些是–with-extname ,有些是 –enable-extname ;有何区别?

  1. –enable-extname  用于模块不需要任何依赖,可以直接开启
  2. –with-extname 用于模块有第三方依赖,需要先安装依赖
  3. 其它就没有差别了
  4. 参考: http://stackoverflow.com/questions/1255055/compiling-php-with-modules-vs-using-shared-modules

如何将尽可能多的模块编译为动态扩展?

 

如何编译所有模块:

./configure –enable-all=shared

如何编译除去指定模块外的所有模块:(下面去掉了两个不太熟悉的模块)

./configure –enable-all=shared –with-enchant=no –with-gmp=no

如何在with模块的时候指定依赖的安装路径:

 

编译选项示例:

 

如何将php.ini php-fpm.conf  php.d php-fpm.d 都放到/etc/php 目录下?如下:

编译选项:

–sysconfdir=/etc/php   : 指示 php-fpm.conf   php-fpm.d 安装到 /etc/php 下

–with-config-file-path=/etc/php :指示 php.ini 安装到 /etc/php 下

–with-config-file-scan-dir=/etc/php/php.d : 指示 php.d 安装到 /etc/php 下

 

php.ini 的安装位置和 –sysconfdir没有关系,默认 ${prefix}/lib

php-fpm.conf 的位置和–with-config-file-path 没有关系,默认 ${prefix}/etc 下

 

 

 

 Posted by at 下午 12:55
7月 012016
 

多态玩的就是虚

什么是多态?
函数的形参中定义基类的情况,当然,这里的基类不一定是爷爷类,父亲类也可以,当实际调用时传递的如果是子类,那么,运行时会检查要调用的类的方法在基类(因为形参是基类,所以要参考基类)中是否virtual的,如果不是virtual的,则直接执行基类中的定义(即使当前确实是子类的实例,也不会执行子类的该方法,换言之,就是不允许覆盖,这就是virtual存在的意义,某些语言是直接覆盖的,没法选择不覆盖),如果是virtual的,则根据继承链向下检查,直到查到该方法的最后一个实现,哪怕继承链中的某些子类没有明确写virtual关键字也没关系(换言之,virtual属性是自动、强制继承的,或者说,dog类中的run方法的virtual关键字是多余的);具体实现上可能不是一个一个查,但至少逻辑上是这样的; 如果animal类的run方法不是virtual的,并不意味着子孙类的run方法再也不能添加virtual了,比如:animal的run没有virtual,dog的run使用了virtual,则run(animal *a)函数只能执行animal类中的run,而dog_run(dog *d) 却可以多态, 即: dog_run(new jinmao()) 时打印金毛的跑法

虚函数

就是允许覆盖,多态的实现方式

纯虚函数

就是没有函数的定义,只有声明,子类想不覆盖都不行,除非子类自己不创建对象,期待孙类的继承;

语法上来讲,函数不定义是不行的,但是纯虚函数就是不定义,所以必须明确说明不定义,即: =0 ,如下: (没有 =0 是不行的)

抽象类与接口

c++中没有抽象类,也没有接口,更没有abstract、interface、implements等关键字,有的只有class和virtual

如果一个类中包含了纯虚函数,则该类自然为抽象类;

如果一个类中只包含纯虚函数,则该类相当于接口;

 Posted by at 下午 1:11
6月 292016
 

50款JavaScript图表库分享:

http://my.oschina.net/u/935975/blog/220987

纯文本流程图: http://my.oschina.net/iamancoder/blog/652233

13个JavaScript图表(JS图表)图形绘制插件:

13个JavaScript图表(JS图表)图形绘制插件

js版的visio: http://demo.qunee.com

js通过数据生成流程图: http://my.oschina.net/blogshi/blog/221749

d3: https://github.com/cpettitt/dagre-d3  功能上来看,基本是dotgraph的js实现

js写的国际象棋: http://www.jointjs.com/demos/chess

 

 

 Posted by at 上午 1:41
6月 282016
 

参考资料:

http://php.net/manual/zh/features.dtrace.php

通过mark的方式,了解php都提供了哪些探针:

php探针完全版: all_probes.stp

 

 Posted by at 下午 5:31
6月 202016
 

参考: http://www.tutorialspoint.com/c_standard_library/c_macro_va_start.htm  (这的代码可以执行的哦)

 

指南站: http://www.tutorialspoint.com

 Posted by at 下午 4:00
6月 062016
 

参考资料:http://blog.aboutc.net/profiling/17/php-profiler-xhprof

这里不说别的,只记录一个小有意思的事情:

由于所谓的PHP内存泄漏,在程序跑上几分钟后就耗尽内存而退出,据说xhprof很是厉害,可以分析是哪个函数占用了太多内存;由于xhprof没有现成的环境,配置起来花费了一些功夫,最后发现,是pdo_mysql的execute占用了90%+的内存,天哪,用了N多年的东西突然有问题了?冥思苦想,夜不能寐。

突然间,想到一个其他的办法,就是在每段代码前后添加memory_get_usage()来检查是否内存使用有发生变化,如果没有变化,则这部分代码没有问题;如果有变化,则这部分代码有问题;(注意:如果这部分代码有函数调用,则函数调用不应该有大的返回值,如果有自己看着处理);就这样,通过二分法一步一步排查,终于发现,小朋友为了提高性能,使用类的静态变量数组cache了sql查询的结果,这个cache没有大小限制。

然后回到xhprof分析的结果,可以想象,之所以xhprof认为pdo_mysql的execute有问题,是因为这些内存都是该函数申请的,你说pdo_mysql 冤不冤?

 Posted by at 下午 3:40
6月 062016
 

一般来讲,浏览器中下载文件都是一个链接给浏览器,下载进度有浏览器来显示;比较先进一些的实现就是通过js不断地循环请求服务器端,来获取下载的百分比。

最近发现一个网站(https://mega.nz/#F!nJR3BTjJ!N5wZsncqDkdKyFQLELU1wQ )在下载文件时,并没有立即调出文件保存对话框,而是直接在网页中显示下载进度,直到下载完毕才弹出文件保存对话框,点击保存就完成了。觉得很新鲜,研究了一下,是通过blob实现的; 关于blob的学习:百度: js blob

文亮同学提到了: URL.createObjectURL  ,稍后再研究这个东西

 Posted by at 下午 3:18