PHP 易出问题记录
PHP foreach引用缺陷
<?php $array = array(1, 2, 3); foreach ($array as &$v) {} foreach ($array as $v) {} print_r($array); ?>
实际输出:
Array ( [0] => 1 [1] => 2 [2] => 2 )
解释: 第一次foreach的时候$v成为了一个引用变量($array[2]),如此,当第二次foreach的时候, 实际上只是在对这个引用变量($array[2])进行了若干次赋值而已。
第一次:$array[2] = 1,此时$array各元素分别为1,2,1
第二次:$array[2] = 2,此时$array各元素分别为1,2,2
第三次:$array[2] = 2,此时$array各元素分别为1,2,2
字符串与整型对比缺陷
<?php $a = 1; $b = "1ab"; echo $a == $b; ?>
输出:
1
解释:
int $a跟string $b进行对比时,php会将string $b进行强制转换成int,即intval($b)
而强转规则是是从字符串左侧起,遇到非数字(或者小数点‘.‘)即终止,有效部分进行强转,
即intval(‘1ab‘) = 1;
所以$a == $b输出1
访问远程http服务使用curl禁用file_get_contents
1. fopen/file_get_contents 每次请求的超时设置不稳定,会导致不同程度的夯住进程 2. fopen/file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。 3. fopen/file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。 4. fopen/file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。 5. curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。
PHP Socket通讯设计陷阱
1. 使用socket_create代替fsocketopen.fsocketopen会有比较大得概率建立连接失败 2. 大数据读取使用socket_recv代替socket_read。socket_read在读取大数据时,会出现读取不全的现象
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。