2019独角兽企业重金招聘Python工程师标准>>>

1. 在PHP中使用协程实现多任务调度

http://www.laruence.com/2015/05/28/3038.html

2. Curl的毫秒超时的一个”Bug”

CentOS服务器上, 当你设置了小于1000ms的超时以后, curl不会发起任何请求, 而直接返回超时错误(Timeout reached 28).

原来, 这里面有一个坑, CURL默认的, 在Linux系统上, 如果使用了系统标准的DNS解析, 则会使用SIGALARM来提供控制域名解析超时的功能, 但是SIGALARM不支持小于1s的超时, 于是在libcurl 7.28.1的代码中(注意中文注释行):

int Curl_resolv_timeout(struct connectdata *conn,const char *hostname,int port,struct Curl_dns_entry **entry,long timeoutms)
{
.......
.......
#ifdef USE_ALARM_TIMEOUTif(data->set.no_signal)/* Ignore the timeout when signals are disabled */timeout = 0;elsetimeout = timeoutms;if(!timeout)/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */return Curl_resolv(conn, hostname, port, entry);if(timeout < 1000) //如果小于1000, 直接超时返回/* The alarm() function only provides integer second resolution, so ifwe want to wait less than one second we must bail out already now. */return CURLRESOLV_TIMEDOUT;  ........
<?phpcurl_setopt($ch, CURLOPT_NOSIGNAL, 1);
?>

这样就可以支持了。

在比较新的PHP版本中,CURLOPT_NOSIGNAL是默认启用的,所以可以不用设置了。

可以纯粹了解一下就行吧。

3.  PHP浮点数的一个常见问题的解答

关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)

不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答:

 
<?php$f = 0.58;var_dump(intval($f * 100)); //为啥输出57
?>

为啥输出是57啊? PHP的bug么?

我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问…

要搞明白这个原因, 首先我们要知道浮点数的表示,

计算机专业科班出身的我,表示理解这个并不难。

4. PDOStatement::bindParam的一个陷阱

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', "test");$query = <<<QUERYINSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare($query);$bind_params = array(':username' => "laruence", ':password' => "weibo");
foreach( $bind_params as $key => $value ){$statement->bindParam($key, $value);
}
$statement->execute();

最后执行的确实下面的sql。

INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");

究其原因, 也就是bindParam和bindValue的不同之处, bindParam要求第二个参数是一个引用变量(reference).

解决方法:

A. 不要使用foreach, 而是手动赋值

$statement->bindParam(":username", $bind_params[":username"]); //$value是引用变量了
$statement->bindParam(":password", $bind_params[":password"]);

B. 使用bindValue代替bindParam, 或者直接在execute中传递整个参数数组.

5. Mcrypt响应慢的一个原因

<?php
$dmcryptText = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");# 显示 AES-128, 192, 256 对应的密钥长度:
#     #16,24,32 字节。
$key_size =  strlen($key);
echo "Key size: " . $key_size . ", key: $key\n";
//$size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
//$iv = mcrypt_create_iv($size);  //注意这里
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
echo "Iv size: " . $iv_size . ", iv: $iv\n";
# 创建和 AES 兼容的密文(Rijndael 分组大小 = 128)# 仅适用于编码后的输入不是以 00h 结尾的# (因为默认是使用 0 来补齐数据)
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $dmcryptText, MCRYPT_MODE_CBC, $iv);
echo base64_encode($ciphertext) . "\n";

这里的问题就在于/dev/random, 它的random pool依赖于系统的中断来产生. 当系统的中断数不足, 不够产生足够的随机数, 那么尝试读取的进程就会等待, 也就是会hang住, 来看一个简单的例子:

解决的办法就是, 改用/dev/urandom, /dev/urandom也是一个产生随机数的设备, 但是它不依赖于系统中断.

Weibo上SAE的同学 @胥昕ops提供了一个不需要修改PHP代码的解决方案:

胥昕ops: SAE 二三月份遇到的这个问题,一条命令秒杀此问题,

$ rngd -r /dev/urandom -o /dev/random -t 1

用urandom的结果填充entropy池子,这样既保证了entropy池的数量,也保证了随机性

然而, 为什么PHP使用/dev/random作为默认, 这是因为理论上来说, /dev/urandom在一定的情况下, 可能会被可预测(参看: /dev/random), 所以一般上认为, /dev/urandom不如/dev/random安全.

后记, 大家看手册, 一定也要看手册下面的评论, 呵呵, 有很多东西在评论中, 是有提到的, 如下面这条评论, 来自mcrypt_create_iv:

6. 再一次, 不要使用(include/require)_once

关于使用include还是include_once(以下,都包含require_once), 这个讨论很长了, 结论也一直有, 就是尽量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载.

解释的比较复杂,懒得解释了,反正尽量少用。

排除这些技术因素, 我也一直认为, 我们应该使用include, 而不是include_once, 因为我们完全能做到自己规划, 一个文件只被加载一次. 还可以借助自动加载, 来做到这一点.

你使用include_once, 只能证明, 你对自己的代码没信心.

7. 关于PHP的编译和执行分离

这篇讲得不是很详细,我也没有能够重现出来,估计是我的打开方式不对,评论里面很多也是说不知道怎么apc_bin_load的,Google了半天还是没有能够解决,所以我就说服自己别去想了,估计也用不上。如果真的要用的话,那么试试Facebook的HHVM或者PHP7,估计效果也比这个强。

8.  请手动释放你的资源(Please release resources manually)

转载于:https://my.oschina.net/laiconglin/blog/690012

阅读鸟哥的风雪之隅PHP博客的笔记(1)相关推荐

  1. 鸟哥的linux私房菜-基础学习篇 读书笔记

    从事linux工作一年多,算是能够熟练运用linux服务器,但仍觉得自己对Linux的原理,理论缺乏空洞,潜下心来认真阅读尘封的鸟哥经典,知识点很全,收获颇多,实践与知识结合,知行合一,对linux开 ...

  2. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  3. 明哥之家的又一个博客

    明哥之家的又一个博客 文/明哥 网上房地产崩盘的论调不少,但明哥还是果断地在CSDN上投资了,继新浪"明哥之家"之后,今天又建新家了.欢迎朋友多多来访. 曾几何时,大学老师成了一群 ...

  4. chmod 777 什么意思:鸟哥的linux私房菜第六章学习笔记

    鸟哥的linux私房菜基础学习篇:心血来潮决定看一下这本书,虽然都是讲很基础的东西,但是,绝对不是浪费时间,比如我看完了之后就终于明白了chmod777是什么意思了. 写这个读书笔记也主要是想记录一些 ...

  5. 《鸟哥的Linux私房菜-基础篇》学习笔记

    主要用来记录学习,如果能帮助到你那最好了. 数据流重导向 概念 cat /etc/crontab /etc/vbirdsay 标准输出:将cat的文件输出到屏幕上 标准错误输出:无法找到文件报错 *系 ...

  6. hexo+git+github+域名搭建个人博客提示404_不用花一分线,松哥手把手教你上线个人博客...

    有不少小伙伴私信松哥,打听松哥的博客是怎么做的,其实这个我之前和大家聊过,今天就再来说一说. 我记得是 2015 年 4 月 15 在CSDN上发表了我的第一篇博客,是一个学习笔记,从那之后开启了我博 ...

  7. 不用花一分线,松哥手把手教你上线个人博客

    上一篇:听说你的 IDEA 昨天掉链子了?松哥给你准备了大招 有不少小伙伴私信松哥,打听松哥的博客是怎么做的,其实这个我之前和大家聊过,今天就再来说一说. 我记得是 2015 年 4 月 15 在CS ...

  8. 借“技术文章如何写作才能有较好的阅读体验”,说我们要认真的对待博客和技术.

    最近也在思考如何更好的规范大家写博客的习惯和看博客的态度,不想看到标题党.占位和各种水贴回复,对自己和他人一点益处都没有,丁点收获都木有,搞这些有毛用. 在酷勤上看到这篇文章,主体突出了我们做技术写技 ...

  9. Guide哥|我写了四年博客,收获了20w+读者。我为什么推荐你写博客?

    掘金的的小伙伴们好!有感而发,发一篇文章表达最近的感受! 我是 Guide 哥,一 Java 后端开发,半个全栈,自由的少年. 01 最近疯狂被读者表白,随便截几张图"炫耀"一下. ...

最新文章

  1. 121-Best Time to Buy and Sell Stock
  2. springboot整合mybatis记录
  3. 内核随记(三)--同步(2)【转】
  4. YOLO-ReT让边缘端也可以实时检测
  5. VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。...
  6. MySQL日期 专题
  7. 技术专家(ai/大数据)_``我们淹没在数据中'':在专家和AI时代如何思考自己
  8. 晶振噪声及杂散_石英晶体振荡器(简称晶振)介绍
  9. file is not a zip file_如何使用JavaScript解压压缩后的zip文件
  10. 美国邮政编码ZIP Code(转载)
  11. sql查询日期格式化
  12. kong翻译_最全的中国姓氏英文说法,你知道自己的姓氏怎么翻译吗?
  13. 软件测试中的“银行企业银行对公渠道转账和财务查询和银企对账项目”
  14. offlc计算机等级报一级还是二级,请问计算机二级MS Office 和MS Office高级应用是一个东西吗?...
  15. 怎么把html放到速卖通详情,速卖通详情页布局怎么弄?
  16. 二手交易app开发可以定制哪些功能
  17. Android中画布连线的连线动画的实现
  18. 平板电脑支持html吗,HTML5视频无法在平板电脑上播放(HTML5 video not playing on tablets)...
  19. Fansblog (HDU - 6608)(威尔迅定理+费马小定理)
  20. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Oops在Linux 2.6内核+PowerPC架构下的前世今生

热门文章

  1. 窥探try ... catch与__try ... __except的区别
  2. 《精通正则表达式》读书笔记(1)
  3. POJ 2947 Widget Factory (高斯消元解同余方程组)
  4. SQL server 200 安装问题!
  5. java 取cpuid、主板id、硬盘id、mac地址
  6. 8.继续分析一破解加密码获取-最最最简单的注册机
  7. 【Groovy】map 集合 ( map 集合操作符重载 | *. 展开操作符 | 代码示例 )
  8. 【Android 逆向】Android 逆向通用工具开发 ( Android 平台运行的 cmd 程序类型 | Android 平台运行的 cmd 程序编译选项 | 编译 cmd 可执行程序 )
  9. 【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )
  10. PYTHON 数据分析常用类库