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在读取大数据时,会出现读取不全的现象 










原文地址:https://www.cnblogs.com/zhaobolu/p/4372001.html